我有两项活动:MainActivity
和Activity2
。
MainActivity只是通过Intent打开第二个。
要返回MainActivity
,Activity2
我按“后退”按钮。
当我执行这些步骤时,应用程序崩溃:
打开应用程序:MainActivity
出现
启动Intent:Activity2
出现
按“返回”按钮:MainActivity
出现
启动Intent
:我的应用程序由于此错误而崩溃:
IllegalArgumentException:无法绘制回收的位图
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
),为了避免内存泄漏,我recycle()
在该onDestroy()
方法中调用。
正如我通过阅读大量 SO 答案和在网络上了解到的那样,调用recycle()
位图可以让它们尽早被垃圾收集。
但许多其他帖子建议不要调用recycle()
,或者至少建议仅当您确定 Activity 中不再需要位图(即方法中)时才执行此操作onDestroy()
。
现在我有点担心我所学到的东西,因为如果我删除该recycle()
错误就不会再发生。
该错误发生在 Android 设备上,但在 Android和(Android )4.4.2
设备上不会发生。6.0
Nexus 7
5.1.1
问题出在活动堆栈上吗?
GC 尝试释放位图内存是否太晚了?在这种情况下,如何彻底销毁 Activity 及其所有内容?
这两个Android版本有什么区别吗?
或者我遗漏/错误的东西?
翻翻过去那场雪
森栏
喵喔喔
相关分类