私のアプリでは、いくつかのサムネイルを含む異なるリストビューを持っています。 私はリファクタリングを開始しており、LRUキャッシングを実装したいと考えています。私はAndroidのガイドラインに従っていますが、アプリケーション全体で1つのLRUキャッシュを初期化する方が良いか、リストビューごとにLRUキャッシュを初期化する方がいいかと思います。 私はoutOfMemoryを恐れています。 したがって、私は自分自身で答えることができない以下の質問があります。 - シングルトンパターンで初期化された1つのLRUキャッシュは良いアイデアですか? - メモリが少ない場合、LRUキャッシュの次の初期化からoutOfMemoryが発生しますか?メモリが不足している場合にLRUキャッシュ:アプリケーション全体で1つだけ初期化しますか?
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// Get max available VM memory, exceeding this amount will throw an
// OutOfMemory exception. Stored in kilobytes as LruCache takes an
// int in its constructor.
final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024);
// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory/8;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// The cache size will be measured in kilobytes rather than
// number of items.
return bitmap.getByteCount()/1024;
}
};
...
}
、LRUキャッシュは自動的に解除されますか?私はLRUキャッシュ(メモリが足りないためアプリクラッシュ)を使用するとアプリがメモリを解放するのに問題があるのだろうかと思っています。
アプリ全体に1つのLRUキャッシュしかありませんか?
- アプリ全体で複数のLRUキャッシュが問題になることはありますか?
こんにちは!現時点では、リストビューのコンストラクタでweakHashMapを初期化しています。そのマップにサムネイルを配置します。私はそれがLRUキャッシュを使う方が良いと思っていましたが、あなたの答えを読んだ後、少し怖いです。 – aeroxr1
私はちょうど 'WeakHashMap'を見ました。私はそれがそのクラスで弱い参照を持つ*キー*であることを認識していませんでした。そのため、あなたは 'Map>'のようなマップを作りたいと思うかもしれません。私はまずこれをやったことを願っています。 'LruCache'クラスはGCに暗黙的な関係を持っていないので、かなり無駄です。だからあなたは正しい軌道に乗っているかもしれません。ただそれを試してみてください。もしうまく行けば、勝利を宣言して、それを1日と呼びましょう。 –
弱いハッシュマップでは弱い参照を持つキーですか?本当に ?私はこれを知らなかった! – aeroxr1