我有两个活动:MainActivity
和 Activity2
。
MainActivity
只是通过 Intent 打开第二个活动。
从 Activity2
返回到 MainActivity
时,我按下“返回”按钮。
当我执行这些步骤时,应用程序崩溃:
- 打开应用程序:出现
MainActivity
- 启动Intent:出现
Activity2
- 按下“返回”按钮:出现
MainActivity
- 启动
Intent
:我的应用程序由于以下错误而崩溃:IllegalArgumentException: Cannot draw recycled bitmaps
MainActivity.java:
Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
Activity2.java:
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
protected void onDestroy() {
super.onDestroy();
for(Map.Entry<Integer, ImageView> entry : mapImageViews.entrySet()) {
ImageView imageView = entry.getValue();
Drawable drawable = imageView.getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if(bitmap != null) {
bitmap.recycle();
}
bitmapDrawable = null;
bitmap = null;
}
imageView.setOnClickListener(null);
imageView.setImageDrawable(null);
imageView.setImageBitmap(null);
imageView = null;
drawable = null;
}
mapImageViews.clear();
mapImageViews = null;
}
由于该应用程序使用高清晰度图像(已使用BitmapFactory
和inSampleSize
进行了适配),为了避免内存泄漏,我在onDestroy()
方法中调用recycle()
。
根据我通过阅读大量SO答案和网页所学到的,调用位图上的recycle()
方法可以让其早日被垃圾收集器回收。
但是许多其他帖子建议不要调用recycle()
,或者至少建议仅在确定位图在Activity中不再需要时才在onDestroy()
方法中调用它。
现在我有点担心自己所学到的知识,因为如果我删除recycle()
,错误就不会再出现。
该错误发生在一个Android 4.4.2
设备上,但它不会在Android 6.0
和Nexus 7
(Android 5.1.1
)设备上发生。
- 问题是否与Activities堆栈有关?
- GC是否试图太晚释放位图的内存?如果是这种情况,如何彻底销毁Activity及其所有内容?
- 这两个Android版本之间有区别吗?
- 还是我漏掉了什么/做错了什么?
mapImageViews
不是静态的,那么将所有内容置空就没有意义了,更像是一种仪式而非真正的清理。 - Miha_x64