From c4faf0cb132a04bff91e4dc8bd83748162258ba1 Mon Sep 17 00:00:00 2001
From: Eino-Ville Talvala
Date: Fri, 16 Sep 2016 13:34:52 -0700
Subject: [PATCH] Docs: Note that a Surface acts like a weak reference
This causes frequent programming errors, when developers assume
that holding onto a Surface will keep its associated SurfaceTexture,
ImageReader, etc, also alive.
Bug: 31551063
Test: m offline-sdk-docs, manual viewing of result
Change-Id: I5fb5bb3e3c80c7d5d735417b1697e0fe9a62fc46
---
core/java/android/view/Surface.java | 12 ++++++++++++
media/java/android/media/ImageReader.java | 4 ++++
2 files changed, 16 insertions(+)
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index f92d83af93a0a..9f46f3fc75b04 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -33,6 +33,18 @@ import dalvik.system.CloseGuard;
/**
* Handle onto a raw buffer that is being managed by the screen compositor.
+ *
+ * A Surface is generally created by or from a consumer of image buffers (such as a
+ * {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, or
+ * {@link android.renderscript.Allocation}), and is handed to some kind of producer (such as
+ * {@link android.opengl.EGL14#eglCreateWindowSurface(android.opengl.EGLDisplay,android.opengl.EGLConfig,java.lang.Object,int[],int) OpenGL},
+ * {@link android.media.MediaPlayer#setSurface MediaPlayer}, or
+ * {@link android.hardware.camera2.CameraDevice#createCaptureSession CameraDevice}) to draw
+ * into.
+ *
+ * Note: A Surface acts like a
+ * {@link java.lang.ref.WeakReference weak reference} to the consumer it is associated with. By
+ * itself it will not keep its parent consumer from being reclaimed.
*/
public class Surface implements Parcelable {
private static final String TAG = "Surface";
diff --git a/media/java/android/media/ImageReader.java b/media/java/android/media/ImageReader.java
index 2cbeb3a260be6..ed718493bd789 100644
--- a/media/java/android/media/ImageReader.java
+++ b/media/java/android/media/ImageReader.java
@@ -241,6 +241,10 @@ public class ImageReader implements AutoCloseable {
* same {@link Surface} can be reused with a different API once the first source is
* disconnected from the {@link Surface}.
*
+ * Please note that holding on to the Surface object returned by this method is not enough
+ * to keep its parent ImageReader from being reclaimed. In that sense, a Surface acts like a
+ * {@link java.lang.ref.WeakReference weak reference} to the ImageReader that provides it.
+ *
* @return A {@link Surface} to use for a drawing target for various APIs.
*/
public Surface getSurface() {