2012-01-20 1 views
12

これまでAndroidの画像用にSoftReferenceキャッシュを使用しています。このキャッシュは、リストビューで表示される画像に使用され、十分なメモリが残っている場合は、画面に表示されていない項目をメモリに保持するのに役立ちます。Androidでメモリイメージキャッシュを実装する方法は?

この問題は、最後のハードリファレンスが解放された瞬間にSoftReferencesがガベージコレクションされてしまうことです。その結果、画面から取り除かれたイメージはその時点でガベージコレクトされ、ユーザーがListViewのこのエントリにスクロールバックすると、イメージは内部の電話機メモリから再ロードされ、結果として複雑な遅延読み込みプロセスが発生します頻繁にリストの再描画や一般的なパフォーマンスの低下が見られます。

ソフトリファレンス動作の場合、bug requestにはこれが意図された動作であると記載されており、このような種類のキャッシュにはLRU-Cacheを使用する必要があります。

ご質問ください。 LRUキャッシュは、私が彼を許すだけの大きさのメモリを取るでしょう。しかし、アプリが大量のメモリを必要とする場合、メモリを解放しません。どのくらいのメモリを私はキャッシュを使用できるようにすることができます決定する必要がありますし、携帯電話のメモリ状況が厳しい場合は、キャッシュのサイズを減らす方法はありますか?

現在、イメージキャッシュは、すべてのアクティビティの一種のグローバルイメージストレージとしてアプリケーション内に保存されます。これは、私の活動がバックグラウンドであっても破壊されたとしても、イメージキャッシュのすべてのメモリを常に使用することになります。

答えて

3

バックグラウンドプロセスを有効に保つことは、OSレベルの最適化であり、プロセスに素早く切り替えることができます。あなたのプロセスは、OSがメモリを買う余裕がある限り、生き続けるでしょう。そのメモリが別のアプリケーションに必要な場合、プロセスは強制終了され、そのリソースは解放されます。

プロセスをバックグラウンドにするたびにキャッシュを解放すると、キャッシュミスが発生するため、アプリケーションへの切り替えはもはや高速になりません。これは、AndroidのKeep-Background-Process-Alive最適化を破っています!

Android 3.0(Honeycomb)より前のリリースのAndroid Support Packageにも含まれているLruCacheを使用してください。

+0

ありがとうございました – Janusz

+0

LruCacheを使用して画像や他のBLOBをどのようにキャッシュするかの問題を解決する方法がわかりません。問題はその固定サイズで、各エントリはキャッシュされたオブジェクトへの強い参照を保持します。これは、デバイスのメモリに応じて拡張されません。 – Matthias

+0

LruCacheは、サイズが設定した制限を超えたときにエントリを削除します。メソッドをオーバーライドすると、LruCacheが各エントリのサイズを測定するのに役立ちます。 –

関連する問題