回收和重用imageview

时间:2016-09-19 15:10:50

标签: android imageview

在MainActivity中的

我在OnCreate上通过此代码使用Picasso设置了我的Imageview图像:

    ivLogo = (ImageView) findViewById(R.id.backimage);
    Picasso.with(getApplicationContext()).load(R.drawable.background).fit()
            .into(ivLogo);

并在On 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

2 个答案:

答案 0 :(得分:0)

无法使用回收位图。似乎你正在这样做。首先,您要回收位图,然后当用户回到活动时,您就会想要使用它。

来自文档:

  

警告:只有在确定时才应使用recycle()   不再使用位图。如果您调用recycle()及更高版本   尝试绘制位图,你会得到错误:“画布:试图   使用回收的位图“。

Managing Bitmap Memory

编辑:在Android 3.0及更高版本上,没有太多理由可以调用回收。 (阅读文档)

答案 1 :(得分:0)

首先,根据您的代码,实际上您为Bitmap对象调用了recycle方法。

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

private void checkRecycled(String errorMessage) {
    if (mRecycled) {
        throw new IllegalStateException(errorMessage);
    }
}

这是Bitmap源代码中的代码片段,首先会在大多数Bitmap操作方法中调用它。

最后也就是说,如果OS API级别高于11,则回收方法实际上对内存回收无效。