2

私のアプリケーションでは、最初に必要になったときにある程度の量のデータをメモリにロードし、アプリケーションの別の部分が使用したい場合に備えてそこに保持したいと考えています。いくつかの異なるActivity'es から同じデータにアクセスできますが、すべてのユーザーが対話できるわけではありません。そのため、アプリケーションの関連部分を操作していないときは、Android が自由にデータを破棄し、必要に応じて再読み込みできるようにしたいと考えています。ユーザーが何をするかは私には予測できないので、しばらく使用されていない場合にのみ Android にデータを解放してもらいたいことに注意してください。これを行うための良いアプローチは何ですか?

class静的にのみ使用される を作成し、静的初期化ブロックにデータをロードすることを考えました。ただし、Dalvik がこの方法で保存された静的データを破棄するかどうかはわかりません。クラスローダーについて何か読んだことがありますが、クラスのロードにどのローダーが使用されているのか、どのように破棄される可能性があるのか​​ わかりません。おそらく誰かが...?

私が思いついた別の方法は、弱参照を使用してデータ保持クラスのインスタンスを保持することです (非静的であることは明らかです) Activity。現時点では問題ありません。(その場合は、データをロードしたままにしておきたいです。)

データの読み込みにはコストがかかります。可能であれば、システムがメモリ不足になったとき、またはアプリケーションが終了したときにのみ破棄したいと考えています。

4

3 に答える 3

3

SoftReferencesが必要なようです。これらは、メモリ不足が検出されると、ガベージ コレクターの裁量でクリアされます。

クラス javadoc を読むと、最近使用されたキャッシュ エントリが再利用されないようにする方法についてヒントが得られます。


記録として、クラスローダーはクラスのインスタンスの管理には役立ちません。ただし、キャッシュを作成するstaticと、キャッシュ クラスがアンロードされた場合に、キャッシュされたオブジェクトを破棄できるようになります。


ファローアップ

私のデータは、1 つのオブジェクトで表されるソリッド ブロックです。

これはむしろ物事を変えます。キャッシュするオブジェクトが 1 つしかない場合、LRU は意味がありません。基本的に、オブジェクトにできるだけ長くぶら下がりたいように聞こえます...オブジェクトに長時間ぶら下がってOOMEをトリガーしないようにします。これはちょっと難しいです。実際、完璧な仕事をするには、ユーザーが何をしようとしているのかを正確に予測する必要があります... これは明らかに不可能です。

おそらく最善の戦略は、参照エンキュー メカニズムを利用し、キュー プロセッサを実装して、オブジェクトを停止させるか、ソフト リンクを再作成するかの「インテリジェントな」選択を行うことです。「インテリジェンス」には、空きメモリの量、および/またはオブジェクトが最後に使用されてからの経過時間の確認が必要になる場合があります。しかし、注意してください!これを間違えると、OOME が発生したり、プラットフォームがガベージ コレクターのスラッシングに多くの時間を費やしたりする可能性があります。

1 つのオブジェクトを保持するようにキャッシュを設定した場合、それはハード リファレンスに相当しますね。

いいえ。SoftReferenceGCを使用すると、メモリが不足している場合に参照が壊れます。

于 2013-01-02T01:30:35.103 に答える
3

SoftReference を使用できます。を見てみましょう:

http://docs.oracle.com/javase/6/docs/api/java/lang/ref/SoftReference.html

SoftReferences を使用すると、必要なことを実現できます。

于 2013-01-02T01:24:56.827 に答える
2

SoftReference のガベージ コレクションが早すぎるのを見てください。

アプリのメモリにデータをキャッシュする場合は、LruCache を調べることもできます。 http://developer.android.com/reference/android/support/v4/util/LruCache.html

ディスクベースのキャッシュの寿命が長い場合は、Android Objects Cacheをご覧ください。

DiskLruCacheソースはhttps://github.com/JakeWharton/DiskLruCache/にあります。

于 2013-01-02T01:37:49.997 に答える