問題タブ [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.

0 投票する
1 に答える
1080 参照

android - サーバーからの画像でAndroid LRUキャッシュを使用するにはどうすればよいですか

アプリで使用できるように、Android LRU キャッシュの使用方法を理解しようとしています。

私はすべて画像に関するアプリを持っています。1 つのアクティビティは画像の GridView を表示し、別のアクティビティは全画面表示の画像を表示します。これら 2 つのアクティビティのほかに、画像はさまざまな方法で使用されます。現在、画像の約 85% がサーバーから取得されています。LRU キャッシュに関する私の質問は次のとおりです。画像をサーバーから直接 LRU キャッシュにロードしますか? それとも、サーバーからアプリのディスク領域に画像をロードし、必要に応じてローカルに保存された画像を LRU キャッシュにロードしますか?

私の混乱の理由はこれです。アプリの画像使用量の約 15% は、アプリがインテントを通じて取得するユーザーのローカル デバイスからのものです

どうやら、ローカルの画像フォルダーから取得したこれらの画像を LRU キャッシュにロードできるようです。LRU キャッシュについて調べる前は、これらのローカル イメージは実質的に既にキャッシュされているという印象を受けていました。とにかく、私の計画は、サーバーから取得した画像のみをキャッシュすることです。しかし、それらをアプリの内部ストレージに保存してから、オンデマンドで LRU キャッシュに渡す必要があるのか​​ 、それとも LRU キャッシュがすでにストレージを処理しているのか疑問に思っています。つまり、アプリが強制終了された場合、LRU キャッシュは空になりますか? 私の懸念をもう一度述べると、サーバーから取得した画像がクラッシュしてアプリが強制終了されても生き残ることを望んでいます。LRU キャッシュ自体はそれに適していますか、それともイメージをディスクに保存し、必要に応じて LRU キャッシュをロードする必要がありますか?

0 投票する
1 に答える
177 参照

android - BitmapFun があまりにもアグレッシブに画像をダウンサンプリングする

トレーニング資料の BitmapFun を使用して、GridView に画像を表示しています。しかし、コードは非常にぼやけた画像を返しています。ImageResizermethodの class の 184 行目まで犯人の 1 人を追跡しましたdecodeSampledBitmapFromDescriptor

実際の方法はこちら

だから私が望むのは、サンプルダウンにそれほど積極的にならないことです. しかし、それはいくつかの疑問につながります: これはビットマップをロードするための公式の推奨事項であるため、サンプリングをあまり積極的でないように変更することにはどのような問題がありますか? より良い品質の写真を得るためにこのコードを変更しなければならなかった人はいますか? 私の調査は正しいですか?つまり、このコードがぼやけた画像の原因ですか? これは質問/疑問の完全なリストではありませんが、これは読者に私の懸念に対する感覚を与えるはずです. 最後に、BitmapFun の目的を妨げずにこの問題を解決するにはどうすればよいですか? 私が BitmapFun に行ったのには明らかに理由があります。それは、私のアプリが正常に動作せず、頻繁にクラッシュしていたからです。今はクラッシュしませんが、画像がぼやけています。

0 投票する
1 に答える
368 参照

android - 一定の時間制限のための Android キャッシュ ネットワーク レスポンス

現在、HttpClient を使用して、JSON オブジェクトを返すネットワーク リクエストを実行しています。戻ってきたデータをキャッシュし、そのキャッシュされたデータに 10 分の有効期限を設定したいと考えています。

LruCache、SQLite、および共有設定の使用を調べました。このタスクを実行する最良の方法はどれですか? 現在、アプリの他の部分に SQLite データベースを使用しているため、それを使用して、データがキャッシュされたときのタイムスタンプを比較することを考えていました。そのオプションは私にとってはうまくいきますが、そのテーブルには常に1行しかないため、やり過ぎのようです。

どんな提案も役に立ちます。ありがとう!

0 投票する
1 に答える
528 参照

android - LRUCache が期待どおりに機能しない

次の例は、制限されたサイズの LRUCache を使用すると、LRUCache の外部に新しい領域を割り当てるときに OutOfMemory エラーが発生することを示しています。

プロパティ: 64MB プロセス サイズ; 10MB LRUキャッシュサイズ; ループで LRUCache に入れた 1MB のチャンク。

57回(64MB - 7MB)試行した後、次のようになります:

lrucache.evictall() の後、キャッシュが解放され、再度割り当てるための十分なスペースがあります。しかし、私はそれが行う方法ではないと思います。

ヒントはありますか?

ここに私のコード:

0 投票する
1 に答える
364 参照

android - LruCache が imageAdapter で動作しない

リソースに 11 個の画像があります。GridView を使用して表示します。

ImageAdapter クラスでは画像が多くのスペースを占めるため、サンプル サイズを計算し、こちらのチュートリアルに従ってリソースをデコードして、画像を効率的に読み込みます。

デコードされたビットマップを返す前にdecodeSampledBitmapFromResource、ビットマップを LruCache に追加しています。

nullgetView()でない場合は、キャッシュされたビットマップを取得しようとします。それ以外の場合は、上記の方法を使用します。

私が使用しているキャッシュからビットマップを追加および取得するために:

何が起こるかというと、それif ( cachedBitmap != null )は決して真実ではなく、何かが間違っていると私に思わせる.

クラスの完全なコード:

}

0 投票する
1 に答える
781 参照

android - Android lrucache

コードandroid lrucache example (Memory Cache)を使用して、ダウンロードした画像 (合計約 120 キロバイト) をキャッシュしましたが、動作しますが、アクティビティ (またはアプリ) から出るとキャッシュが削除され、再びアクティビティに移動すると、画像を再度ダウンロードしてキャッシュします。

教えてください: lrucache を使用して 5 日近く (1 MB 近く) データを保存できる場合、またはそれができない場合は、DiskLruCache を使用して保存できますか? 前もって感謝します。

0 投票する
0 に答える
452 参照

android - クラスでの DiskLruImageCache の使用

この回答に従って、リストビューに表示する必要があるビットマップをキャッシュしようとしています。しかし、クラスでの使用方法についてはどこにも言及されていません。DiskLruImageCacheクラスでを使用する方法のサンプル コードを誰か教えてもらえますか?

編集

これは私が試したものです。私は多くのアクティビティを持っているので、という名前のシングルトン クラスを使用していModelます。モデル クラス内のインスタンスを作成DiskLruImageCacheし、最初のアクティビティの onCreate で次のようにオブジェクトを初期化します。

Model次に、ビットマップを保存および取得するために、クラスに次の 2 つのメソッドを用意します。

次に、画像を保存する必要があるクラスで、次のようにします。

そしてそれを得るために私は使用します:

しかし、ビットマップを取得していませんでした。DiskLruImageCache.java次に、デバッグを試みたところ、ビットマップを保存しようとすると以下が実行されるため、画像がキャッシュに保存されていることがわかりました。

これは、画像がキャッシュされていることを意味します。しかし、ビットマップを取得しようとすると、以下が実行されますDiskLruImageCache.java

"mykey"次に、ビットマップを格納するために使用したキーがキャッシュに存在するかどうかをin のcontainsKey(String key)メソッドを使用して確認しましDiskLruImageCache.javaたが、false も返されます。それは、ビットマップを保存するために使用したキーでさえそこになく、保存されています。私がしていることに問題はありますか?多くの人が答えから正しく機能していることがわかったからです。ここで何が間違っていますか?これを修正する方法は?

0 投票する
1 に答える
841 参照

android - グローバル LruCache と多くのローカル LruCache の実装

Activity私のアプリのいくつかの は、ListViewの各行に がListView含まれている場所に画像を表示しますImageView

この例は、ユーザーが検索して結果を取得し、各結果の画像が表示される検索画面です。

LruCacheグローバルを実装することと、それぞれActivityに独自のローカルを含めることのコスト/メリットを比較検討しようとしていますLruCache

これが私の2つの主な問題です。どちらも、私のアプリが非常に大きいという事実を中心に展開しています。つまり、これらの画像を表示する画面がかなりあるということです。また、私のアプリには、人気のあるサイド メニューのナビゲーション方法があります。このため、メニューを開いて、 をタップActivity Bして、メニューを開き、 をタップして、メニューActivity Aを開いて... など、Activity無限に ABABABABABABABAB のスタックを作成できました。

グローバル

グローバルからActivityの with ImageViews using s には、これらへの参照が含まれていませんか? ユーザーがsome をクリックして、このページから移動したとします。それは現在スタック上にあり、まだそれらへの参照を保持しています。がポップした場合、スタック上の一部がそれへの参照を保持しているときに、それを本当に回収できますか?BitmapLruCacheBitmapsActivityButtonActivityActivityBitmapsLruCacheBitmapBitmapImageViewActivity

以前に独自のカスタム キャッシュを作成していました。a を呼び出しrecycle()Bitmap後、ユーザーが戻るボタンを押して、そのセットをActivity含むスタック上の一部に戻ると、アプリがクラッシュします。これが、スタック上のs 上の s がまだs への参照を保持していると私が信じている理由です。ImageViewBitmapImageViewActivityBitmap

ローカル

先に述べたように。私のアプリは非常に大きく、サイド メニュー スタイルのナビゲーションにより、ユーザーはかなり大きなActivityスタックを作成できます。これにより、多くの が作成されますLruCache。また、初期化時にサイズを宣言する必要があるため、サイズLruCacheを選択する良い方法はないようです。

考え?提案?

この時点で、グローバルにやらなければならないと思いますが、Activityスタック参照の問題を解決する方法がわかりません。これが、多くのアプリが直面していない問題ではないとは思えません。なぜそれに関する情報が見つからないのかわかりません。