AndroidのBitmap
メモリの問題により、Web からイメージをダウンロードし、ローカル コピーを保存し、必要に応じてローカル コピーから を作成するカスタム ローダーおよびダウンローダー クラスを実装することになりましたBitmap
。これらを のリストにSoftReference<T>
保持して、しばらく保持し、その後ガベージ コレクションを行い、その時点でクラスのfinalize()
メソッドが呼び出されます。
protected void finalize() throws Throwable {
Log.w("IMAGEPACK", "Finalizing " + mBitmap);
if(mBitmap!=null&&!mBitmap.isRecycled()) mBitmap.recycle();
super.finalize();
}
LogCat を見ると、このコードはクラッシュの直前に発生していると判断しました。私もコードをステップ実行しましたが、失敗したのはこの行です。
私は以前に同期参照カウントを使用するソリューションを持っていましたが、これはかなり信頼できるように見えましたが、これを回避したい前に手動で記述された参照カウントに大きな問題がありました。元に戻さなければならないかもしれませんが、ここでビットマップのリサイクルが失敗する理由を知りたいです。
現在、2.3.3 の Samsung Galaxy S でテストしています。