web-dev-qa-db-ja.com

グライド:画像が既にキャッシュされているかどうかを確認し、キャッシュされたバージョンを使用するにはどうすればよいですか?

シナリオ

ユーザーが Glide -Image Loading and Caching libraryを使用してアプリを初めて開くときにキャッシュしたい大きなGIF画像があります。その後、ユーザーがアプリを開くたびに、キャッシュバージョンがある場合はそれを表示します。このGIF URLは、一定の間隔で期限切れになります。有効期限が切れたら、新しいGIF URLをフェッチし、将来の使用のために表示/キャッシュします。

試したこと:

Glideのgithubページで Caching and Cache Invalidation を試しました。また、Googleグループスレッド イメージがディスクキャッシュからのみ読み込まれるようにする にもアクセスしました。これは、イメージフォームキャッシュを取得する方法を示しています。 特定の画像のGlideキャッシュを無効にする方法 の質問もありました。

上記のリンクから、キャッシュから画像をロードする方法を示す次のコードスニペットが表示されます。ただし、これはキャッシュから画像を取得しようとするだけです。キャッシュに存在しない場合、ネットワークから取得しようとして失敗します。

Glide.with(TheActivity.this)
        .using(new StreamModelLoader<String>() {
            @Override
            public DataFetcher<InputStream> getResourceFetcher(final String model, int i, int i1) {
                return new DataFetcher<InputStream>() {
                    @Override
                    public InputStream loadData(Priority priority) throws Exception {
                        throw new IOException();
                    }

                    @Override
                    public void cleanup() {
                    }

                    @Override
                    public String getId() {
                        return model;
                    }

                    @Override
                    public void cancel() {
                    }
                };
            }
        })
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);

質問:

  1. 以下を達成するためのよりクリーンな方法があります:存在する場合はキャッシュからGIFイメージを表示し、そうでない場合はGIFをダウンロードし、後で使用するためにキャッシュしてImageViewに表示します。

  2. 上記のキャッシュに関する記事には、次のことが記載されています。

    実際には、キャッシュファイルを無効にする最良の方法は、コンテンツが変更されたときに識別子を変更することです(URL、URI、ファイルパスなど)

    前のURLが期限切れになると、サーバーは別のURLをアプリに送信します。この場合、古いイメージは最終的にガベージコレクションになりますか?キャッシュから画像を強制的に削除する方法はありますか?

  3. 同様の注意として、特定のキーを持つ画像のガベージコレクションを防止し(大きなファイルを再度ダウンロードしないようにする)、後でURLが変更されたときにキャッシュから古い画像を削除するよう指示する方法はありますか?

25
Shobhit Puri
  1. キャッシュからGIFを表示し、存在しない場合はそれを取得するためのカスタムModelLoaderは必要ありません。これは実際にはGlideのデフォルトの動作です。標準のロードラインを使用するだけでうまくいくはずです:

    Glide.with(TheActivity.this)
       .load("http://sampleurl.com/sample.gif")
       .diskCacheStrategy(DiskCacheStrategy.SOURCE)
       .into(theImageView);
    

あなたのコードはGlideがGIFをダウンロードするのを防ぎ、既にキャッシュされている場合にのみGIFを表示します。

  1. はい、古いイメージは最終的に削除されます。デフォルトでは、GlideはLRUキャッシュを使用するため、キャッシュがいっぱいになると、最も最近使用されていないイメージが削除されます。キャッシュのサイズを簡単にカスタマイズして、必要に応じてこれを支援することができます。キャッシュサイズを変更する方法については、 構成 wikiページを参照してください。

  2. 残念ながら、キャッシュの内容に直接影響を与える方法はありません。アイテムを明示的に削除したり、アイテムを強制的に保持したりすることはできません。適切なディスクキャッシュサイズを使用すれば、通常、どちらを実行するかを心配する必要はありません。イメージを十分に頻繁に表示する場合、削除されません。追加のアイテムをキャッシュしてキャッシュ内のスペースを使い果たすと、スペースを確保するために古いアイテムが自動的に削除されます。

33
Sam Judd
 Glide.with(context)
 .load("http://sampleurl.com/sample.gif")
 .skipMemoryCache(true)
 .into(imageView);

既にGlideにメモリキャッシュをスキップするように指示するために.skipMemoryCache(true)を呼び出したことに既に気付いています。これは、Glideが画像をメモリキャッシュに入れないことを意味します。これはメモリキャッシュにのみ影響することを理解することが重要です! Glideは、ディスクキャッシュを引き続き使用して、同じ画像URLへの次のリクエストに対する別のネットワークリクエストを回避します。詳細については、こちらをお読みください Glideキャッシュ&リクエストの最適化

ハッピーコーディング!!

1
Hemant Parmar