diff options
| author | 2017-03-20 21:57:23 -0700 | |
|---|---|---|
| committer | 2017-03-20 21:57:23 -0700 | |
| commit | 3bc95b5b712c44c687ef04156b63c70c930f69f2 (patch) | |
| tree | d8682b9f16adc993994df907c1fb4dd24df76184 | |
| parent | 44ab5750929fe70da87ea82f0f914845f8141e08 (diff) | |
SurfaceView: Fix Surface leak when changing format.
We simply weren't destroying the old Surface (though the finalizer
would have eventually caught it). As we destroy it we need to use
a Window preservation scheme similar to what the WindowManager
provided.
Bug: 36447956
Test: Manual
Change-Id: I8b4210eb76cec364522cc0a40014517e42ebbe68
| -rw-r--r-- | core/java/android/view/SurfaceView.java | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index f559d42b6f55..e59073999683 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -114,6 +114,9 @@ public class SurfaceView extends View { SurfaceSession mSurfaceSession; SurfaceControl mSurfaceControl; + // In the case of format changes we switch out the surface in-place + // we need to preserve the old one until the new one has drawn. + SurfaceControl mDeferredDestroySurfaceControl; final Rect mTmpRect = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -475,6 +478,7 @@ public class SurfaceView extends View { if (creating) { mSurfaceSession = new SurfaceSession(viewRoot.mSurface); + mDeferredDestroySurfaceControl = mSurfaceControl; mSurfaceControl = new SurfaceControl(mSurfaceSession, "SurfaceView - " + viewRoot.getTitle().toString(), mSurfaceWidth, mSurfaceHeight, mFormat, @@ -676,6 +680,12 @@ public class SurfaceView extends View { Log.i(TAG, System.identityHashCode(this) + " " + "finishedDrawing"); } + + if (mDeferredDestroySurfaceControl != null) { + mDeferredDestroySurfaceControl.destroy(); + mDeferredDestroySurfaceControl = null; + } + mHandler.sendEmptyMessage(DRAW_FINISHED_MSG); } |