关于位图:Android BitmapFactory.decodeResource out of memory if used more than once
Android BitmapFactory.decodeResource out of memory if used more than once
我正在重新编写一个 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) // Calculate inSampleSize // Decode bitmap with inSampleSize set |
然后,在活动中,我将背景设置为 backgroundImage。
应用程序第一次启动时这是可行的,但如果更改了共享首选项,则应用程序会尝试再次解码资源,并且应用程序会在上面标记的点崩溃。请问我可以做些什么来避免这种情况?
相关讨论
- 与 OOM 崩溃?
- 您能否在此处添加您的崩溃报告(日志)。所以我可以帮助您。
- 它确实因 OOM 错误而崩溃,相关行是我在上面标记的行。我已经把日志放在这里了。
每次使用完位图后,都应该释放它们,因为它们会占用大量内存。
在 onDestroy() 中你应该这样写:
bitmap.recycle();
bitmap = null; |
您也应该在停止使用位图时调用这些行。
相关讨论
- 我一直在主应用程序中尝试这样做。在活动中,我在 onCreate() 中有类似的内容:
layout.setBackgroundDrawable(myApplication.getBackground());
我会接受原始答案,因为确实需要将位图设置为 null 是正确的。问题是我把它设置在错误的地方。
读取位图时,应用程序中出现错误,但这是因为活动中的位图。所以,我必须在每个活动中都这样做来修复它:
layout.setBackgroundDrawable(null);
layout.setBackgroundDrawable(myApplication.getBackground()); |