これまでAndroidの画像用にSoftReferenceキャッシュを使用しています。このキャッシュは、リストビューで表示される画像に使用され、十分なメモリが残っている場合は、画面に表示されていない項目をメモリに保持するのに役立ちます。Androidでメモリイメージキャッシュを実装する方法は?
この問題は、最後のハードリファレンスが解放された瞬間にSoftReferencesがガベージコレクションされてしまうことです。その結果、画面から取り除かれたイメージはその時点でガベージコレクトされ、ユーザーがListViewのこのエントリにスクロールバックすると、イメージは内部の電話機メモリから再ロードされ、結果として複雑な遅延読み込みプロセスが発生します頻繁にリストの再描画や一般的なパフォーマンスの低下が見られます。
ソフトリファレンス動作の場合、bug requestにはこれが意図された動作であると記載されており、このような種類のキャッシュにはLRU-Cacheを使用する必要があります。
ご質問ください。 LRUキャッシュは、私が彼を許すだけの大きさのメモリを取るでしょう。しかし、アプリが大量のメモリを必要とする場合、メモリを解放しません。どのくらいのメモリを私はキャッシュを使用できるようにすることができます決定する必要がありますし、携帯電話のメモリ状況が厳しい場合は、キャッシュのサイズを減らす方法はありますか?
現在、イメージキャッシュは、すべてのアクティビティの一種のグローバルイメージストレージとしてアプリケーション内に保存されます。これは、私の活動がバックグラウンドであっても破壊されたとしても、イメージキャッシュのすべてのメモリを常に使用することになります。
ありがとうございました – Janusz
LruCacheを使用して画像や他のBLOBをどのようにキャッシュするかの問題を解決する方法がわかりません。問題はその固定サイズで、各エントリはキャッシュされたオブジェクトへの強い参照を保持します。これは、デバイスのメモリに応じて拡張されません。 – Matthias
LruCacheは、サイズが設定した制限を超えたときにエントリを削除します。メソッドをオーバーライドすると、LruCacheが各エントリのサイズを測定するのに役立ちます。 –