8

バックグラウンド

Android の最大ヒープ サイズは非常に限られており、デバイスごとに最大ヒープが異なります。

一部のアプリでは、内部/外部ストレージだけでなく、メモリ内に物 (通常は画像) をキャッシュする機能が必要です。

もちろん、ビットマップの処理やメモリの使用をできるだけ少なくするためのヒントはたくさんありますが、キャッシュも必要です。

問題

キャッシングの可能な解決策をたくさん読んだことがありますが、キラーキャッシングソリューションとなるような種類のキャッシングを提供するものはありません。私が望んでいるのは、次の機能を持つキャッシュメカニズムです。

  1. メモリ不足を心配することなく、ヒープを無制限に使用できます。アプリにはメモリが必要ですが、十分な空きメモリがありませんか? そのため、いくつかの (参照されていない) アイテム (およびそのキー) を解放します。

  2. スレッドの安全性/並行性。

  3. LRU ベースのキャッシュを提供することで、最近使用されたアイテムが残る可能性が高くなります。

  4. 可能な限り生き続けます (ただし、クラッシュは発生しません)。しかし悲しいことに、Android では Java に比べて非常に迅速にソフト/ウィーク参照が GC されます。

  5. 実寸を隠した物を扱える能力。Android では、API 10 以下では、ビットマップはヒープ メモリを使用しませんでしたが、ヒープ メモリと見なされていたため、単一の参照 (4バイト程度)。これが、一部のソリューションが、各アイテムのサイズと、アイテムを削除するときに何をすべきかを人為的に伝えることを提案する理由です。

いくつかの良い解決策

  1. LruCache - API 12 のクラス (コードは簡単にコピーできます)。

    利点: #2 (?)、#3、#5。

    欠点: #1、#4、さらに API 12 で提供されているため、ソース コードをコピーする必要があります。

  2. 50ページに示されているように、このレクチャーから取得した、その値のソフト/弱い参照を持つハッシュマップ

    利点: #1 (ただし、キーは削除されません)、#2 ( ConcurrentHashMapを使用する必要があります)

    短所: #3、#4、#5

  3. 以前のソリューションの高度なバージョンのようなMapMaker ( guavaライブラリから入手可能)。

    メリット : #1, #2

    短所: #3、#4、#5

  4. guava ライブラリを介したキャッシュ ソリューション。長所と短所は、選択に基づいています。どの構成がニーズに最も適しているか、また Android で正常に動作するかどうかはわかりません。残念ながら、Android 用のライブラリをコンパイルすることさえできません。

  5. Android クエリ- どのように機能するかわかりません。とても使いやすいようですが、メリットとデメリットがよくわかりません。

質問

キラーキャッシングメカニズムを知っている人はいますか?

機能 #5 についてはあまり気にしません。これは非常に高度であり、新しい Android バージョンを使用する人が増えているため、将来的にはあまり必要とされないためです。

4

3 に答える 3

2

私が見ることができるように、#1には実際的な禁止の問題があります。アプリの他の部分から参照されているオブジェクトを解放することはできません。したがって、メモリを自由に解放する構造を作成することは不可能です。

私が見る唯一の解決策は、LRU をサポートし、弱参照と強参照の両方を処理できる独自のキャッシュを作成することです。アイテムは強い参照として開始され、しばらく使用されない場合、またはメモリの制約が課せられる場合は、弱い参照に変更します。これを作成するのは簡単ではなく、すべてのアプリケーションで確実に微調整を行う必要があります。

于 2013-01-28T20:41:24.560 に答える
0

LruCache の大幅な改良版である Android BitMap Cache を見てみましょう。

http://www.senab.co.uk/2013/01/24/android-bitmapcache-v2-1/

于 2013-01-28T21:15:43.560 に答える
0

おそらく、より一般的な解決策を探しているでしょうが、主に画像に焦点を当てている場合は、ImageLoaderを見てください。私はしばらくそれを使用してきましたが、私が必要としているものには非常にうまく機能します. 初期化するときに、LRUCache を使用するように指示し、使用する空きメモリの割合を指示できます。

補足として、HttpResponseCacheを使用すると、サーバーからのデータを非常にうまくキャッシュできます。

于 2013-01-28T21:02:22.330 に答える