Hello Fennec-devs,

While monitoring some memory issues last week, I ran into this. We had a piece 
of code for resetting the image in an ImageView:

imageView.setImageBitmap(null);

This did the intended thing. The image was cleared, and the UI showed no 
problems.

But under the hood, Android does:

    @android.view.RemotableViewMethod
    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));
    }
As you can see, there is no check on whether “bm” is null or not. This creates 
a “BitmapDrawable” object. The BitmapDrawable internally creates “State” 
objects and “Paint” objects. All of these aren’t even going to be used, as we 
are just clearing up the image in the view. Now think of resetting the 
ImageView (like favicon), whenever the row goes out of visible area inside a 
list (recycling). With a small scroll, we would be creating endless objects 
while recycling. (HORRORRR!!!) So, instead of using setImageBitmap(), please 
use setImageDrawable()  in such cases.

Note: setImageResource(android.R.color.transparent) is also valid. But, Android 
decodes the resource in the UI thread, and might not be good for performance 
purposes.

Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=934001

Thanks,
Sriram.
_______________________________________________
mobile-firefox-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/mobile-firefox-dev

Reply via email to