Androidアプリでキャッシュの最初のレイヤーを実装しようと考えています。 OOMの例外を確実に避けるためにSoftReferencesを検討していましたが、Androidがこれらを「あまりにも早く」解放する方法に関する記事が多数あるので、android.util.LruCacheキャッシュを調べることにしました。デバイスの機能と空きメモリに応じてLRUキャッシュのサイズを変更する
質問:実際のデバイスのサイズを正しく設定するにはどうすればよいですか? LRUキャッシュがSoftReferencesではなく、実際のソリューションであることはとても素晴らしいことですが、OOM例外を避けることを本当に熱望しているなら、数メガバイトのハードリファレンスを使用することは非常に危険です。あなたが私に尋ねるならば、それはただ安全ではない。とにかく、これは唯一の選択肢のようです。 私はgetMemoryClassを調べて、実際のデバイスでアプリケーションのヒープサイズを調べました(キャッシュをサイジングする前に空きヒープサイズを確認しています)。ベースラインは16メガですが、これはOkですが、私はEOM例外を5メガバイトのヒープサイズ(Eclipse MATによると)だけ投げているデバイス(旧式の例ではG1)を見てきました。私はG1が非常に古くなっていることを知っていますが、ポイントは私の経験が実際には文書で言及されている16メガベースラインと一致していないということです。したがって、私が合理的に得ることができる最大のものが必要な場合は、どのようにLRUキャッシュをどのようにスケールアップするべきか、私は完全には不明です。 (8メガに満足しており、低スペックのデバイスで1メガバイトと小さくなるだろう)
ありがとうございました。
編集:私が参照してるAndroidのLRUキャッシュクラス:あなたの質問からhttp://developer.android.com/reference/android/util/LruCache.html
ええ、私はメモリクラスを使用して同様の方法を終了しました。私はまだそれが推測のあまりにも多くを見つけるが、私はより正確な方法に遭遇していない。 – user289463
sizeOfもバイト単位のサイズを返すことを確認してください。上のリンクでは、彼らはbitmap.getByteCount()/ 1024を返しました(キロバイトで!これはもちろん動作しますが、cacheSizeは1024 * memClass/8でなければなりません) – DominicM