我正在重新编写一个Android应用,其中每个活动(有几个)都会显示背景图片。用户可能会更改此图像,因此我已完成以下操作:
以下是我用于设置图片的部分代码,基于http://developer.android.com/training/displaying-bitmaps/load-bitmap.html:
Bitmap bitmap = decodeBitmap(R.drawable.background_image, screen_width, screen_height);
}
public BitmapDrawable backgroundImage = new BitmapDrawable(bitmap);
public Bitmap decodeBitmap(int resId, int reqWidth, int reqHeight)
{
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(getResources(), resId, options); // crashes here
}
然后,在活动中,我将背景设置为backgroundImage。
第一次启动应用程序时,这有效,但如果更改了共享首选项,则应用程序会再次尝试解码资源,并且应用程序会在上面标记的位置崩溃。请问我可以做些什么来避免这种情况?
答案 0 :(得分:1)
每次使用Bitmap时,都应该释放它们,因为它们占用了大量内存。
在onDestroy()中你应该写一些类似的东西:bitmap.recycle();
bitmap = null;
每当你停止使用位图时,你也应该调用这些行。
答案 1 :(得分:0)
我接受原始答案,因为将位图设置为null确实是正确的。问题是我把它放在了错误的地方。
读取位图时,应用程序中会发生错误,但这是因为活动中的位图。因此,我必须在每个活动中执行此操作来修复它:
layout.setBackgroundDrawable(null);
layout.setBackgroundDrawable(myApplication.getBackground());