From b7ba1220a3dc3012d2e22825eaeb0e643333f5a4 Mon Sep 17 00:00:00 2001 From: John Reck Date: Thu, 9 Jul 2015 17:37:34 -0700 Subject: Teach ImageView to recycle internal drawables Bug: 22289362 It's pretty common for ImageView#setBitmap to be called repeatedly. Avoid re-creating the BitmapDrawable in this scenario as that has high object churn of semi-expensive objects like Paint. Change-Id: Ib77719cd0366d02c1a42f774850bf3b9caa9c288 --- core/java/android/widget/ImageView.java | 22 +++++++++++++++++++++- .../android/graphics/drawable/BitmapDrawable.java | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index a1582f2..a1e6cc8 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -570,6 +570,17 @@ public class ImageView extends View { } } + private static class ImageViewBitmapDrawable extends BitmapDrawable { + public ImageViewBitmapDrawable(Resources res, Bitmap bitmap) { + super(res, bitmap); + } + + @Override + public void setBitmap(Bitmap bitmap) { + super.setBitmap(bitmap); + } + }; + /** * Sets a Bitmap as the content of this ImageView. * @@ -579,7 +590,16 @@ public class ImageView extends View { public void setImageBitmap(Bitmap bm) { // if this is used frequently, may handle bitmaps explicitly // to reduce the intermediate drawable object - setImageDrawable(new BitmapDrawable(mContext.getResources(), bm)); + if (mDrawable instanceof ImageViewBitmapDrawable) { + ImageViewBitmapDrawable recycledDrawable = (ImageViewBitmapDrawable) mDrawable; + // Hacky fix to force setImageDrawable to do a full setImageDrawable + // instead of doing an object reference comparison + mDrawable = null; + recycledDrawable.setBitmap(bm); + setImageDrawable(recycledDrawable); + } else { + setImageDrawable(new ImageViewBitmapDrawable(mContext.getResources(), bm)); + } } public void setImageState(int[] state, boolean merge) { diff --git a/graphics/java/android/graphics/drawable/BitmapDrawable.java b/graphics/java/android/graphics/drawable/BitmapDrawable.java index fcd7f63..cf91be1 100644 --- a/graphics/java/android/graphics/drawable/BitmapDrawable.java +++ b/graphics/java/android/graphics/drawable/BitmapDrawable.java @@ -219,7 +219,8 @@ public class BitmapDrawable extends Drawable { } } - private void setBitmap(Bitmap bitmap) { + /** @hide */ + protected void setBitmap(Bitmap bitmap) { if (mBitmapState.mBitmap != bitmap) { mBitmapState.mBitmap = bitmap; computeBitmapSize(); -- cgit v1.1