32

シナリオ:

ユーザーがGlide - Image Loading and Caching ライブラリを使用して初めてア​​プリを開いたときにキャッシュしたい大きな GIF 画像があります。その後、ユーザーがアプリを開くたびに、キャッシュされたバージョンがあればそれを表示したいと考えています。この GIF URL は、一定期間後に期限切れになります。有効期限が切れたら、新しい GIF URL を取得し、将来の使用のためにそれを表示/キャッシュします。

私が試したこと:

Glide の github ページでキャッシングとキャッシュの無効化を行いました。また、Google グループのスレッドEnsuring That Images Loaded Only Come From Disk Cacheも調べました。これは、画像フォーム キャッシュを取得する方法を示しています。また、特定の画像の質問に対して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 をアプリに送信します。この場合、古いイメージは最終的に Garbage Collected になると思いますか? キャッシュから画像を強制的に削除する方法はありますか?

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

4

2 に答える 2