在我的应用程序中,我使用此方法多次更改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);
}
答案 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