12

これまで、Androidの画像にSoftReferenceキャッシュを使用していました。このキャッシュは、ListViewsに表示される画像に使用され、十分なメモリが残っている場合は、画面に表示されないアイテムの画像をメモリに保持するのに役立ちます。

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

ソフト参照動作のバグリクエストには、これは意図された動作であり、この種のものをキャッシュするにはLRUキャッシュを使用する必要があると記載されています。

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

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

4

1 に答える 1

3

バックグラウンドプロセスを存続させることは、プロセスへの切り替えを高速化するOSレベルの最適化です。OSがメモリに余裕がある限り、プロセスは存続します。そのメモリが別のアプリケーションに必要になると、プロセスが強制終了され、そのリソースが解放されます。

プロセスがバックグラウンドで実行されるたびにキャッシュを解放すると、キャッシュミスが発生するため、アプリケーションへの切り替えは高速ではなくなります。これは、Androidのkeep-background-processes-alive最適化を無効にします。

LruCacheを使用する必要があります。これは、Android 3.0(Honeycomb)より前のリリースのAndroidサポートパッケージにも含まれています。

于 2012-01-20T16:45:22.620 に答える