如果我在 onDestroy() 中调用 recycle(),“无法绘制回收位图”

use*_*558 5 java android garbage-collection exception bitmap

我有两个活动:MainActivityActivity2

MainActivity 只是通过 Intent 打开秒一。

要返回MainActivityActivity2我按下“返回”按钮。

当我执行这些步骤时,应用程序崩溃:

  • 打开应用程序:MainActivity出现
  • 启动意图:Activity2出现
  • 按“返回”按钮:MainActivity出现
  • 启动Intent:由于此错误,我的应用程序崩溃:

    IllegalArgumentException:无法绘制回收位图

主活动.java:

Intent intent = new Intent(this, Activity2.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

由于应用程序使用高分辨率图像(已使用BitmapFactory和 进行调整inSampleSize),为了避免内存泄漏,我recycle()在该onDestroy()方法中调用。

正如我通过阅读大量 SO 答案和在网络上了解到的那样,调用recycle()位图可以让它们尽早被垃圾收集。

但是许多其他帖子建议不要调用recycle(),或者至少建议仅当您确定 Activity 中不再需要位图时才这样做,即在onDestroy()方法中。

现在我有点担心我对它的了解,因为如果我删除recycle()了错误就不会再发生了。

该错误发生在装有 Android 的设备上4.4.2,但在装有 Android6.0Nexus 7(Android 5.1.1)的设备上不会发生。

  • 是关于活动堆栈的问题吗?
  • GC 是否尝试释放位图的内存为时已晚?在这种情况下,如何明确销毁 Activity 及其所有内容?
  • 这两个安卓版本有什么区别吗?
  • 或者我遗漏了什么/错了?

小智 1

根据回收文件

位图被标记为“死”,这意味着如果调用 getPixels() 或 setPixels() 它将抛出异常,并且不会绘制任何内容。此操作无法逆转,因此仅当您确定该位图不再使用时才应调用它。

我看不到你如何将 your 分配bitmaps给 your ImageView,但我假设当你在位图被使用后再次启动意图时,你正在尝试重用位图recycled。我只在使用时遇到异常android:src=。如果我ImageView使用以下内容设置位图oncreate,它在您列出的所有目标上运行良好,不会引发异常。

imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.lake_park));
Run Code Online (Sandbox Code Playgroud)

我强烈建议使用 glide 来处理图像。 https://github.com/bumptech/glide