2

ビットマップが占有しているメモリを解放する必要があります。recycle()だから、私の活動が終わったら、私は彼ら全員に電話しています。

これらのビットマップは、背景プロパティまたはソース ( の場合ImageView) プロパティとして、常にドローアブルで使用されます。

ただし、問題は、後で別のアクティビティにこれらのビットマップも使用するビューがある場合に表示されることです。

java.lang.RuntimeException: Canvas: リサイクルされたビットマップを使用しようとしています。

どうすればよいでしょうか。ビットマップをメモリに保持することはできませ。ユーザーがある時点で、ビットマップを使用するアクティビティを開始する可能性があるからです。ビットマップにメモリを解放し、後で再び使用できるようにするにはどうすればよいですか?

4

3 に答える 3

2

解決策は、これを使用してビットマップとビューを初期化することです。

Bitmap b = BitmapFactory.decodeResource(resources, R.drawable.mybitmap);
view.setBackgroundDrawable(new BitmapDrawable(b));

ただし、これは XML ビットマップでは機能しません。ただし、ビットマップはビューから取得できる必要があります。

メモリ内にビットマップ インスタンスがあると、その上で recycle() を呼び出してメモリをすぐに解放できます。

ビットマップをリサイクルする前に、それがどのビューからも参照されていないことを確認する必要があります - ドローアブル/ビューの参照を null に設定します。そうしないと、例外がスローされます。これを行うには、ビットマップを参照しているビューを追跡し、リサイクルする前にすべての参照を null にする必要があります。

したがって、私の実際の問題はビットマップを再利用していませんでした。問題は、ビューによって参照されている間にビットマップをリサイクルすることでした。

于 2012-07-22T22:15:37.833 に答える
0

Bitmaps をDrawables とsandroid:sourceのs にしか使用ImageViewしない場合、なぜBitmapオブジェクトが存在するのでしょうか? そのような場合、Android は最適なメモリ使用を処理し、呼び出す必要はまったくありませんrecycle()

于 2012-07-09T08:25:51.827 に答える
0

でビットマップがリサイクルされているかどうかを確認できますbitmap.isRecycled()。このメソッドが true を返す場合、ビットマップを再初期化できます。このようなもの:

if(bitmap != null && bitmap.isRecycled()) {
  //Reinitialize the image
}
else {
  //The bitmap is not recycled, you can use it
}
于 2012-07-09T08:40:47.040 に答える