2016-09-19 5 views
1

を再利用:リサイクルと私はOnCreateの上でこのコードでピカソを使用して、私のImageViewのの画像を設定MainActivityでImageViewの

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

とOnDestroy関数にでリサイクル:私は私のImageViewのをリサイクルする必要が

((BitmapDrawable)ivLogo.getDrawable()).getBitmap().recycle(); 

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 

答えて

0

あなたをリサイクルビットマップを使用することはできません。そして、それはあなたがそうしているようです。最初にビットマップをリサイクルしていて、ユーザーがアクティビティに戻ったときにそれを使用しようとしています。ドキュメントから

Caution: You should use recycle() only when you are sure that the bitmap is no longer being used. If you call recycle() and later attempt to draw the bitmap, you will get the error: "Canvas: trying to use a recycled bitmap".

Managing Bitmap Memory

編集:アンドロイド3.0以降でリサイクルを呼び出すためにそんなに理由はありません。 (Read doc)

+0

を超えている場合、リサイクル、私はその活動をリサイクルし、終了後にImageViewのを再利用したい、なぜそのことはできないとして、その同じ最初からそれをやっていないのですか? –

+0

あなたはImageViewの再利用について話していますが、実際にはリサイクルメソッドはビットマップに対してのみです。 – adalPaRi

+0

ビットマップをリサイクルすると、アプリが完全に破棄されて再び開くまで、もう使用しないことになります。だから、あなたがやっていることは、最初から走っていることと同じではありません。 – adalPaRi

0

まず、コードに従って、実際にはBitmapオブジェクトのリサイクルメソッドを呼び出します。

第二に、あなたはビットマップをリサイクルたら、それはもはや使用することはできません、あなたがソースコードをチェックすることができます。

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

を。これは、ビットマップソースコード内のコードスニペットであり、それが最初に呼び出されますほとんどのビットマップ操作方法で使用できます。

最終となく、少なくとも、リサイクル方法は、実際にメモリに何もしないOSのAPIレベルは11

+0

そしてあなたはOOMの問題についてあまり心配する必要はありません。特にピカソを使用しています。それはあなたのピークメモリを管理するためです。 – Sherlock

関連する問題