Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android imageview的回收和重用_Android_Imageview - Fatal编程技术网

Android imageview的回收和重用

Android imageview的回收和重用,android,imageview,Android,Imageview,在MainActivity中,我使用毕加索在OnCreate上通过以下代码设置Imageview的图像: ivLogo = (ImageView) findViewById(R.id.backimage); Picasso.with(getApplicationContext()).load(R.drawable.background).fit() .into(ivLogo); 并在OnDestroy功能中循环: ((BitmapDrawable)ivL

在MainActivity中,我使用毕加索在OnCreate上通过以下代码设置Imageview的图像:

    ivLogo = (ImageView) findViewById(R.id.backimage);
    Picasso.with(getApplicationContext()).load(R.drawable.background).fit()
            .into(ivLogo);
并在OnDestroy功能中循环:

((BitmapDrawable)ivLogo.getDrawable()).getBitmap().recycle();
我必须回收我的Imageview以避免OutOfMemory错误

但是当我从另一个代码返回到这个活动时:

        Intent it = new Intent(WorldChose.this, MainMenu.class);
        // it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(it);
        overridePendingTransition(R.anim.from_middle, R.anim.to_middle);
        finish();
我得到这个错误:

09-19 15:04:32.465: E/AndroidRuntime(2112): java.lang.IllegalArgumentException: Cannot draw recycled bitmaps

您不能使用回收的位图。看来你正在这么做。首先要循环使用位图,然后在用户返回活动时使用它

从文件:

注意:只有在确定 位图不再使用。如果调用recycle()及更高版本 尝试绘制位图时,会出现错误:“Canvas:正在尝试 使用回收的位图”


编辑:在安卓3.0及更高版本上,没有太多理由称其为回收。(阅读文档)

您不能使用回收的位图。看来你正在这么做。首先要循环使用位图,然后在用户返回活动时使用它

从文件:

注意:只有在确定 位图不再使用。如果调用recycle()及更高版本 尝试绘制位图时,会出现错误:“Canvas:正在尝试 使用回收的位图”


编辑:在安卓3.0及更高版本上,没有太多理由称其为回收。(阅读文档)

首先,根据您的代码,实际上您调用了位图对象的回收方法

其次,一旦回收位图,它就不能再使用了,您可以检查源代码:

private void checkRecycled(String errorMessage) {
    if (mRecycled) {
        throw new IllegalStateException(errorMessage);
    }
}
这是位图源代码中的代码片段,大多数位图操作方法都会首先调用它


最后也是最重要的一点,如果操作系统API级别高于11,回收方法实际上对内存回收没有任何作用。

首先,根据您的代码,实际上您为位图对象调用了回收方法

其次,一旦回收位图,它就不能再使用了,您可以检查源代码:

private void checkRecycled(String errorMessage) {
    if (mRecycled) {
        throw new IllegalStateException(errorMessage);
    }
}
这是位图源代码中的代码片段,大多数位图操作方法都会首先调用它


最后也是最重要的一点,如果操作系统API级别高于11,则recycle方法实际上与内存回收无关。

我想在回收并完成该活动后重新使用imageview,为什么不可能,它与从一开始就运行一个活动是一样的,不是吗?你说的是重新使用imageview,但实际上,回收方法仅适用于位图。如果你回收位图,这意味着在应用程序完全销毁并重新打开之前,你将不再使用它。因此,您所做的与从头开始运行不同。我想在循环并完成该活动后重用imageview,为什么不可能,它与从头开始运行活动相同,不是吗?您说的是重用imageview,但实际上循环方法仅适用于位图。如果您循环使用位图,这意味着,在应用程序完全销毁并重新打开之前,你不会再使用它。所以你所做的并不等同于从头开始跑步,你也不必太担心OOM问题,尤其是你使用的是毕加索。因为它能为你控制峰值内存,而且你不必太担心OOM问题,尤其是你在使用毕加索。因为它可以为您控制峰值内存。