問題タブ [android-lru-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - サーバーからの画像でAndroid LRUキャッシュを使用するにはどうすればよいですか
アプリで使用できるように、Android LRU キャッシュの使用方法を理解しようとしています。
私はすべて画像に関するアプリを持っています。1 つのアクティビティは画像の GridView を表示し、別のアクティビティは全画面表示の画像を表示します。これら 2 つのアクティビティのほかに、画像はさまざまな方法で使用されます。現在、画像の約 85% がサーバーから取得されています。LRU キャッシュに関する私の質問は次のとおりです。画像をサーバーから直接 LRU キャッシュにロードしますか? それとも、サーバーからアプリのディスク領域に画像をロードし、必要に応じてローカルに保存された画像を LRU キャッシュにロードしますか?
私の混乱の理由はこれです。アプリの画像使用量の約 15% は、アプリがインテントを通じて取得するユーザーのローカル デバイスからのものです
どうやら、ローカルの画像フォルダーから取得したこれらの画像を LRU キャッシュにロードできるようです。LRU キャッシュについて調べる前は、これらのローカル イメージは実質的に既にキャッシュされているという印象を受けていました。とにかく、私の計画は、サーバーから取得した画像のみをキャッシュすることです。しかし、それらをアプリの内部ストレージに保存してから、オンデマンドで LRU キャッシュに渡す必要があるのか 、それとも LRU キャッシュがすでにストレージを処理しているのか疑問に思っています。つまり、アプリが強制終了された場合、LRU キャッシュは空になりますか? 私の懸念をもう一度述べると、サーバーから取得した画像がクラッシュしてアプリが強制終了されても生き残ることを望んでいます。LRU キャッシュ自体はそれに適していますか、それともイメージをディスクに保存し、必要に応じて LRU キャッシュをロードする必要がありますか?
android - BitmapFun があまりにもアグレッシブに画像をダウンサンプリングする
トレーニング資料の BitmapFun を使用して、GridView に画像を表示しています。しかし、コードは非常にぼやけた画像を返しています。ImageResizer
methodの class の 184 行目まで犯人の 1 人を追跡しましたdecodeSampledBitmapFromDescriptor
。
実際の方法はこちら
だから私が望むのは、サンプルダウンにそれほど積極的にならないことです. しかし、それはいくつかの疑問につながります: これはビットマップをロードするための公式の推奨事項であるため、サンプリングをあまり積極的でないように変更することにはどのような問題がありますか? より良い品質の写真を得るためにこのコードを変更しなければならなかった人はいますか? 私の調査は正しいですか?つまり、このコードがぼやけた画像の原因ですか? これは質問/疑問の完全なリストではありませんが、これは読者に私の懸念に対する感覚を与えるはずです. 最後に、BitmapFun の目的を妨げずにこの問題を解決するにはどうすればよいですか? 私が BitmapFun に行ったのには明らかに理由があります。それは、私のアプリが正常に動作せず、頻繁にクラッシュしていたからです。今はクラッシュしませんが、画像がぼやけています。
android - 一定の時間制限のための Android キャッシュ ネットワーク レスポンス
現在、HttpClient を使用して、JSON オブジェクトを返すネットワーク リクエストを実行しています。戻ってきたデータをキャッシュし、そのキャッシュされたデータに 10 分の有効期限を設定したいと考えています。
LruCache、SQLite、および共有設定の使用を調べました。このタスクを実行する最良の方法はどれですか? 現在、アプリの他の部分に SQLite データベースを使用しているため、それを使用して、データがキャッシュされたときのタイムスタンプを比較することを考えていました。そのオプションは私にとってはうまくいきますが、そのテーブルには常に1行しかないため、やり過ぎのようです。
どんな提案も役に立ちます。ありがとう!
android - LRUCache が期待どおりに機能しない
次の例は、制限されたサイズの LRUCache を使用すると、LRUCache の外部に新しい領域を割り当てるときに OutOfMemory エラーが発生することを示しています。
プロパティ: 64MB プロセス サイズ; 10MB LRUキャッシュサイズ; ループで LRUCache に入れた 1MB のチャンク。
57回(64MB - 7MB)試行した後、次のようになります:
lrucache.evictall() の後、キャッシュが解放され、再度割り当てるための十分なスペースがあります。しかし、私はそれが行う方法ではないと思います。
ヒントはありますか?
ここに私のコード:
android - LruCache が imageAdapter で動作しない
リソースに 11 個の画像があります。GridView を使用して表示します。
ImageAdapter クラスでは画像が多くのスペースを占めるため、サンプル サイズを計算し、こちらのチュートリアルに従ってリソースをデコードして、画像を効率的に読み込みます。
デコードされたビットマップを返す前にdecodeSampledBitmapFromResource
、ビットマップを LruCache に追加しています。
nullgetView()
でない場合は、キャッシュされたビットマップを取得しようとします。それ以外の場合は、上記の方法を使用します。
私が使用しているキャッシュからビットマップを追加および取得するために:
何が起こるかというと、それif ( cachedBitmap != null )
は決して真実ではなく、何かが間違っていると私に思わせる.
クラスの完全なコード:
}
android - Android lrucache
コードandroid lrucache example (Memory Cache)を使用して、ダウンロードした画像 (合計約 120 キロバイト) をキャッシュしましたが、動作しますが、アクティビティ (またはアプリ) から出るとキャッシュが削除され、再びアクティビティに移動すると、画像を再度ダウンロードしてキャッシュします。
教えてください: lrucache を使用して 5 日近く (1 MB 近く) データを保存できる場合、またはそれができない場合は、DiskLruCache を使用して保存できますか? 前もって感謝します。
android - クラスでの DiskLruImageCache の使用
この回答に従って、リストビューに表示する必要があるビットマップをキャッシュしようとしています。しかし、クラスでの使用方法についてはどこにも言及されていません。DiskLruImageCache
クラスでを使用する方法のサンプル コードを誰か教えてもらえますか?
編集
これは私が試したものです。私は多くのアクティビティを持っているので、という名前のシングルトン クラスを使用していModel
ます。モデル クラス内のインスタンスを作成DiskLruImageCache
し、最初のアクティビティの onCreate で次のようにオブジェクトを初期化します。
Model
次に、ビットマップを保存および取得するために、クラスに次の 2 つのメソッドを用意します。
次に、画像を保存する必要があるクラスで、次のようにします。
そしてそれを得るために私は使用します:
しかし、ビットマップを取得していませんでした。DiskLruImageCache.java
次に、デバッグを試みたところ、ビットマップを保存しようとすると以下が実行されるため、画像がキャッシュに保存されていることがわかりました。
これは、画像がキャッシュされていることを意味します。しかし、ビットマップを取得しようとすると、以下が実行されますDiskLruImageCache.java
"mykey"
次に、ビットマップを格納するために使用したキーがキャッシュに存在するかどうかをin のcontainsKey(String key)
メソッドを使用して確認しましDiskLruImageCache.java
たが、false も返されます。それは、ビットマップを保存するために使用したキーでさえそこになく、保存されています。私がしていることに問題はありますか?多くの人が答えから正しく機能していることがわかったからです。ここで何が間違っていますか?これを修正する方法は?
android - グローバル LruCache と多くのローカル LruCache の実装
Activity
私のアプリのいくつかの は、ListView
の各行に がListView
含まれている場所に画像を表示しますImageView
。
この例は、ユーザーが検索して結果を取得し、各結果の画像が表示される検索画面です。
LruCache
グローバルを実装することと、それぞれActivity
に独自のローカルを含めることのコスト/メリットを比較検討しようとしていますLruCache
。
これが私の2つの主な問題です。どちらも、私のアプリが非常に大きいという事実を中心に展開しています。つまり、これらの画像を表示する画面がかなりあるということです。また、私のアプリには、人気のあるサイド メニューのナビゲーション方法があります。このため、メニューを開いて、 をタップActivity B
して、メニューを開き、 をタップして、メニューActivity A
を開いて... など、Activity
無限に ABABABABABABABAB のスタックを作成できました。
グローバル
グローバルからActivity
の with ImageView
s using s には、これらへの参照が含まれていませんか? ユーザーがsome をクリックして、このページから移動したとします。それは現在スタック上にあり、まだそれらへの参照を保持しています。がポップした場合、スタック上の一部がそれへの参照を保持しているときに、それを本当に回収できますか?Bitmap
LruCache
Bitmaps
Activity
Button
Activity
Activity
Bitmaps
LruCache
Bitmap
Bitmap
ImageView
Activity
以前に独自のカスタム キャッシュを作成していました。a を呼び出しrecycle()
たBitmap
後、ユーザーが戻るボタンを押して、そのセットをActivity
含むスタック上の一部に戻ると、アプリがクラッシュします。これが、スタック上のs 上の s がまだs への参照を保持していると私が信じている理由です。ImageView
Bitmap
ImageView
Activity
Bitmap
ローカル
先に述べたように。私のアプリは非常に大きく、サイド メニュー スタイルのナビゲーションにより、ユーザーはかなり大きなActivity
スタックを作成できます。これにより、多くの が作成されますLruCache
。また、初期化時にサイズを宣言する必要があるため、サイズLruCache
を選択する良い方法はないようです。
考え?提案?
この時点で、グローバルにやらなければならないと思いますが、Activity
スタック参照の問題を解決する方法がわかりません。これが、多くのアプリが直面していない問題ではないとは思えません。なぜそれに関する情報が見つからないのかわかりません。