更改ImageView资源时出现Android OutOfMemoryException

时间:2013-12-04 13:35:44

标签: android exception resources imageview out-of-memory

在我的应用程序中,我使用此方法多次更改ImageView的资源:

private void setIcon(int id, int imageSource) {
    ((ImageView)findViewById(id)).setBackgroundResource(imageSource);
}

过了一会儿,我得到一个OutOfMemoryException。在加载新资源(图像)之前是否有更好的方法来释放旧资源(图像)?

修改

private void setIcon(int id, int imageSource) {
    ImageView imageView = (ImageView)findViewById(id);
    Drawable bg= imageView.getBackground();

    if(bg != null && bg instanceof BitmapDrawable) {
         BitmapDrawable bitmapDrawable = (BitmapDrawable) bg;
         bitmapDrawable.getBitmap().recycle();
         if(D)Log.d(TAG, "recycled bitmap");
    }

    Bitmap bm = BitmapFactory.decodeResource(getResources(), imageSource);
    imageView.setImageBitmap(bm);

}

1 个答案:

答案 0 :(得分:0)

在设置新背景之前,请尝试清除旧背景的内存,如下所示:

Drawable bg = image.getBackground();
if(bg != null && bg instanceof BitmapDrawable) {
    BitmapDrawable bitmapDrawable = (BitmapDrawable) bg;
    bitmapDrawable.getBitmap().recycle();
}

您是否有特定理由设置backgroundResource?你不能简单地使用image.setResource()。这样就更容易获得位图并回收它。

编辑:如果你只想要一张图片(没有叠加或其他东西),那么这比较容易(以及它应该如何):

ImageView image = (ImageView)findViewById(id);
image.setImageResource(imageSource);

使用位图:

Bitmap bm = BitmapFactory.decodeResource(getResources(), id);
image.setImageBitmap(bm);
image.getDrawable(); // will return a BitmapDrawable