diff options
Diffstat (limited to 'core/java/android/view')
-rw-r--r-- | core/java/android/view/DisplayList.java | 6 | ||||
-rw-r--r-- | core/java/android/view/GLES20Canvas.java | 34 | ||||
-rw-r--r-- | core/java/android/view/GLES20DisplayList.java | 43 | ||||
-rw-r--r-- | core/java/android/view/HardwareCanvas.java | 8 | ||||
-rw-r--r-- | core/java/android/view/HardwareRenderer.java | 1 | ||||
-rw-r--r-- | core/java/android/view/View.java | 8 | ||||
-rw-r--r-- | core/java/android/view/ViewGroup.java | 16 |
7 files changed, 60 insertions, 56 deletions
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java index b1160f0..e7c2231 100644 --- a/core/java/android/view/DisplayList.java +++ b/core/java/android/view/DisplayList.java @@ -39,12 +39,6 @@ abstract class DisplayList { abstract void end(); /** - * Frees resources taken by this display list. This method must be called - * before releasing all references. - */ - abstract void destroy(); - - /** * Indicates whether this display list can be replayed or not. * * @return True if the display list can be replayed, false otherwise. diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index d78c68a..5d9bd1e 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -34,6 +34,11 @@ import android.text.GraphicsOperations; import android.text.SpannableString; import android.text.SpannedString; import android.text.TextUtils; +import android.util.Finalizers; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; /** * An implementation of Canvas on top of OpenGL ES 2.0. @@ -84,22 +89,35 @@ class GLES20Canvas extends HardwareCanvas { if (mRenderer == 0) { throw new IllegalStateException("Could not create GLES20Canvas renderer"); + } else { + new CanvasFinalizer(this); } } private native int nCreateRenderer(); private native int nCreateDisplayListRenderer(); - @Override - public synchronized void destroy() { - if (mRenderer != 0) { + private static native void nDestroyRenderer(int renderer); + + private static class CanvasFinalizer extends Finalizers.ReclaimableReference<GLES20Canvas> { + private static final Set<CanvasFinalizer> sFinalizers = Collections.synchronizedSet( + new HashSet<CanvasFinalizer>()); + + private int mRenderer; + + CanvasFinalizer(GLES20Canvas canvas) { + super(canvas, Finalizers.getQueue()); + mRenderer = canvas.mRenderer; + sFinalizers.add(this); + } + + @Override + public void reclaim() { nDestroyRenderer(mRenderer); - mRenderer = 0; + sFinalizers.remove(this); } } - private native void nDestroyRenderer(int renderer); - /////////////////////////////////////////////////////////////////////////// // Canvas management /////////////////////////////////////////////////////////////////////////// @@ -178,11 +196,11 @@ class GLES20Canvas extends HardwareCanvas { private native int nCreateDisplayList(int renderer); - void destroyDisplayList(int displayList) { + static void destroyDisplayList(int displayList) { nDestroyDisplayList(displayList); } - private native void nDestroyDisplayList(int displayList); + private static native void nDestroyDisplayList(int displayList); @Override public void drawDisplayList(DisplayList displayList) { diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java index 2886bf3..11e6d30 100644 --- a/core/java/android/view/GLES20DisplayList.java +++ b/core/java/android/view/GLES20DisplayList.java @@ -16,6 +16,12 @@ package android.view; +import android.util.Finalizers; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + /** * An implementation of display list for OpenGL ES 2.0. */ @@ -33,8 +39,6 @@ class GLES20DisplayList extends DisplayList { throw new IllegalStateException("Recording has already started"); } - destroyCanvas(); - mCanvas = new GLES20Canvas(true, true); mStarted = true; mRecorded = false; @@ -42,16 +46,6 @@ class GLES20DisplayList extends DisplayList { return mCanvas; } - private void destroyCanvas() { - if (mCanvas != null) { - mCanvas.destroyDisplayList(mNativeDisplayList); - mCanvas.destroy(); - - mCanvas = null; - mNativeDisplayList = 0; - } - } - @Override void end() { if (mCanvas != null) { @@ -59,16 +53,31 @@ class GLES20DisplayList extends DisplayList { mRecorded = true; mNativeDisplayList = mCanvas.getDisplayList(); + new DisplayListFinalizer(this); } } @Override - void destroy() { - destroyCanvas(); - } - - @Override boolean isReady() { return !mStarted && mRecorded; } + + private static class DisplayListFinalizer extends Finalizers.ReclaimableReference<DisplayList> { + private static final Set<DisplayListFinalizer> sFinalizers = Collections.synchronizedSet( + new HashSet<DisplayListFinalizer>()); + + private int mNativeDisplayList; + + DisplayListFinalizer(GLES20DisplayList displayList) { + super(displayList, Finalizers.getQueue()); + mNativeDisplayList = displayList.mNativeDisplayList; + sFinalizers.add(this); + } + + @Override + public void reclaim() { + GLES20Canvas.destroyDisplayList(mNativeDisplayList); + sFinalizers.remove(this); + } + } } diff --git a/core/java/android/view/HardwareCanvas.java b/core/java/android/view/HardwareCanvas.java index 22d2fe6..8b8d15e 100644 --- a/core/java/android/view/HardwareCanvas.java +++ b/core/java/android/view/HardwareCanvas.java @@ -34,14 +34,6 @@ abstract class HardwareCanvas extends Canvas { } /** - * This method <strong>must</strong> be called before releasing a - * reference to a hardware canvas. This method is responsible for - * freeing native resources associated with the hardware. Not - * invoking this method properly can result in memory leaks. - */ - public abstract void destroy(); - - /** * Invoked before any drawing operation is performed in this canvas. */ abstract void onPreDraw(); diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 0247f6a..6f4abef 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -414,7 +414,6 @@ public abstract class HardwareRenderer { @Override void destroy(boolean full) { if (full && mCanvas != null) { - mCanvas.destroy(); mCanvas = null; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index baa749a..0456463 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -7417,7 +7417,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING) { return null; } - if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { return null; } @@ -7425,10 +7424,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility if ((mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED && ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || mDisplayList == null)) { - if (mDisplayList != null) { - mDisplayList.destroy(); - } - mDisplayList = mAttachInfo.mHardwareRenderer.createDisplayList(); final HardwareCanvas canvas = mDisplayList.start(); @@ -7456,8 +7451,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility canvas.onPostDraw(); mDisplayList.end(); - - canvas.destroy(); } } @@ -7532,7 +7525,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility mUnscaledDrawingCache = null; } if (mDisplayList != null) { - mDisplayList.destroy(); mDisplayList = null; } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index f34fd63..7b2703b 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -1700,10 +1700,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } return false; } - + /** * {@inheritDoc} - * + * * @hide */ @Override @@ -1715,10 +1715,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager children[i].dispatchStartTemporaryDetach(); } } - + /** * {@inheritDoc} - * + * * @hide */ @Override @@ -1915,7 +1915,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (skipChildren) { for (int i = 0; i < count; i++) { getChildAt(i).setVisibility(visibilities[i]); - } + } } return b; @@ -2045,7 +2045,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * * @param i The current iteration. * @return The index of the child to draw this iteration. - * + * * @see #setChildrenDrawingOrderEnabled(boolean) * @see #isChildrenDrawingOrderEnabled() */ @@ -2186,7 +2186,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager (child.mPrivateFlags & DRAW_ANIMATION) == 0) { return more; } - + float alpha = child.getAlpha(); // Bail out early if the view does not need to be drawn if (alpha <= ViewConfiguration.ALPHA_THRESHOLD && (child.mPrivateFlags & ALPHA_SET) == 0 && @@ -2360,7 +2360,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View[] children = mChildren; final int count = mChildrenCount; for (int i = 0; i < count; i++) { - + children[i].setSelected(selected); } } |