web-dev-qa-db-ja.com

Picassoのキャッシュを無効にする

Picasso 、たとえばPicasso.with(ctx).load(new File("/path/to/image")).into(imageView)を使用してディスクから画像をロードしますが、そのファイルに新しい画像を保存し、ImageViewを更新するたびに、ピカソはビットマップをキャッシュします。

Picassoでキャッシュを無効にすることはできますか?

72
Maarten

Picassoの最近のバージョンでは、回避策なしで無効化する新しいメソッドがあります。そのため、この場合、前述のカスタムPicassoToolsクラスは廃止されたと思います。

Picasso.with(getActivity()).invalidate(file);
84
mes

実際、あなた自身の答えに基づいて、ライブラリをフォークせずにそれを行う簡単な方法があります。このクラスをcom.squareup.picassoパッケージに追加します。

package com.squareup.picasso;

public class PicassoTools {

    public static void clearCache (Picasso p) {
        p.cache.clear();
    }
}

キャッシュにはパッケージの可視性があるため、このutilクラスはキャッシュをクリアできます。あなたはそれを呼び出す必要があります:

PicassoTools.clearCache(Picasso.with(context));
78
shalafi

以下のコードスニペットのように、フラグ:emoryPolicy.NO_CACHEおよびNetworkPolicy.NO_CACHEによってメモリポリシーを示すことにより、メモリキャッシュとディスクキャッシュのチェックを中止します。

   mPicasso.with(mContext)
            .load(url)
            .memoryPolicy(MemoryPolicy.NO_CACHE )
            .networkPolicy(NetworkPolicy.NO_CACHE)
            .resize(512, 512)
            .error(R.drawable.login)
            .noFade()
            .into(imageView);

使用してみてください:

Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
14
user3361741

すべてのキャッシュを一度に削除する場合にできることは、カスタムPicasso.LruCacheを作成し、それに対してclearメソッドを使用することです。

サンプルを次に示します。

Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());

キャッシュをクリアするには:

picassoCache.clear();
11
Aerilys

別のオプションは、たとえばアプリの起動時にキャッシュディレクトリ自体を削除することです。

deleteDirectoryTree(context.getCacheDir());

どこ:

/**
 * Deletes a directory tree recursively.
 */
public static void deleteDirectoryTree(File fileOrDirectory) {
    if (fileOrDirectory.isDirectory()) {
        for (File child : fileOrDirectory.listFiles()) {
            deleteDirectoryTree(child);
        }
    }

    fileOrDirectory.delete();
}

これにより、キャッシュディレクトリ全体が削除されます。これは、アプリの最初の使用をシミュレートする場合に適しています。 Picassoキャッシュのみを削除する場合は、「picasso-cache」をパスに追加します。

11

Picassoでの検索画像の順序は次のとおりです。メモリキャッシュ->ディスクキャッシュ->ネットワーク

したがって、Picassoでキャッシュを無効にする必要があるシナリオはほとんどありません。

1。メモリキャッシュの無効化:

  • ユーザーケース:イメージがディスクキャッシュまたはリモートホストで既に更新されている場合
  • 解決策:存在する場合、URL、ファイル、Uriのキャッシュをクリアします

    mPicasso.with(appContext).invalidate(File);
    mPicasso.with(appContext).invalidate(Url);
    mPicasso.with(appContext).invalidate(Uri);
    

2。メモリキャッシュとディスクキャッシュを無効にするOnline

※注意:Onlineは、ImageViewへの直接更新を意味します

  • ユーザーケース:リモートホストで更新された画像

  • 解決策:メモリキャッシュとディスクキャッシュのイメージを中止し、リモートホストのイメージを要求します

    mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE )
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .into(imageView);
    

    ->メモリキャッシュとディスクキャッシュを中止する

。メモリキャッシュとディスクキャッシュを無効にするOffline

※注:オフラインは、ImageViewを更新せず、バックグラウンドでフェッチして後で使用することを意味します

  • ユーザーケース:リモートホスト上のイメージが更新されていることがわかっているが、キャッシュを更新するのは後で使用する場合のみ(イメージビューへの更新ではない)
  • 解決策:フェッチのみ

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.NO_CACHE)
        .fetch();
    

※注:fetch()を使用するのは良いことですが、ネットワークリソースも消費するため、慎重に検討してください。より良い解決策については、以下のシナリオ4を確認してください。

4。メモリキャッシュとディスクキャッシュを無効にするディスクキャッシュが存在する場合はオフライン

  • ユーザーケース:ディスクキャッシュに既に存在する場合にのみキャッシュを無効にします
  • 解決策:取得前にNetworkPolicy.OFFLINE cacheパラメーターを使用してディスクを確認する必要があります

     mPicasso.with(appContext)
        .load(url)
        .memoryPolicy(MemoryPolicy.NO_CACHE)
        .networkPolicy(NetworkPolicy.OFFLINE)
        .fetch(new Callback() {
            @Override
            public void onSuccess() {
                //Success: mean disk cache exist -> should do actual fetch
                picasso.load(url).fetch();
            }
    
            @Override
            public void onError() {
            //Failed: mean disk cache not exist
        }
    });
    

Picassoは素晴らしいライブラリです。squareupが今後のキャッシュを管理するためのより便利なAPIを追加することを願っています。

9
NguyenDat

独自のキャッシュを設定してピカソの画像キャッシュをクリアし、クリアできます。このコードはPicasso 2.5.0でテストされました

private Picasso picasso;
private LruCache picassoLruCache;

picassoLruCache = new LruCache(context);

// Set cache
picasso = new Picasso.Builder(context) //
        .memoryCache(picassoLruCache) //
        .build();

// Clear cache
picassoLruCache.clear();
8
Stanley Kou

きれいにループしませんが、このアプローチはキャッシュとピカソの問題を修正しました。特定のURLのキャッシュを無効にする場合にのみこれを使用します。このアプローチは時間がかかり、おそらく正しい方法ではありませんが、私にとってはうまくいきます。

    String url = "http://www.blablabla.com/Raiders.jpg";
    Picasso.with(this).invalidate(url);
    Picasso.with(this)
            .load(url)
            .networkPolicy(
                    NetworkUtils.isConnected(this) ?
                            NetworkPolicy.NO_CACHE : NetworkPolicy.OFFLINE)
            .resize(200, 200)
            .centerCrop()
            .placeholder(R.mipmap.ic_avatar)
            .error(R.mipmap.ic_avatar)
            .into(imageView);
6
João Machete

ここで受け入れられている答えには非常に重要な部分が欠けています。ここからトリックを見つけました: http://blogs.candoerz.com/question/124660/Android-image-cache-is-not-clearing-in-picasso.aspx

次の行を呼び出すだけで、元の画像を表示するときにサイズ変更、中央切り抜きなどのカスタムオプションを使用する場合、写真のキャッシュはクリアされません。

Picasso.with(getContext()).invalidate(file);

ソリューション:

画像を表示するときは、stableKey()メソッドを使用します。

Picasso.with(getContext()).load(new File(fileUri))
                         .skipMemoryCache()
                         .placeholder(R.drawable.placeholder)
                         .stableKey(fileUri)
                         .into(imageview);

次に、これを呼び出すことにより、このファイルのキャッシュを後でクリアできます。

Picasso.with(getContext()).invalidate(fileUri);

これが役立つことを願っています。

2
OrangeTree

skipMemoryCache()でメモリキャッシュをスキップできます

以下をご覧ください

        Picasso.with(this)
            .load(IMAGE_URL)
            .skipMemoryCache()
            .placeholder(R.drawable.placeholder)
            .error(R.drawable.no_image)
            .into(mImageViewPicasso);

gradle compile "com.squareup.picasso:picasso:2.4.0"

1
Android Dev

別のオプションは、新しいイメージを元のファイルとは異なるファイルに保存することです。 Picassoビットマップキャッシュはファイルパスからキーオフされているため、別のファイルから新しいイメージをロードすると、キャッシュミスが発生します。これには、キャッシュ全体をクリアする必要がないという副次的な利点もあります。

0
Ilan Klinghofer

ソースコードごとに、代わりにshutdown()を使用してください。シャットダウンすると、以降のリクエストの受け入れが停止され、すべてのキャッシュがクリアされます

 /** Stops this instance from accepting further requests. */
  public void shutdown() {
    if (this == singleton) {
      throw new UnsupportedOperationException("Default singleton instance cannot be shutdown.");
    }
    if (shutdown) {
      return;
    }
    cache.clear();
    cleanupThread.shutdown();
    stats.shutdown();
    dispatcher.shutdown();
    for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) {
      deferredRequestCreator.cancel();
    }
    targetToDeferredRequestCreator.clear();
    shutdown = true;
  }

また、シングルトンインスタンスをシャットダウンすることはできません。したがって、Picassoのインスタンス変数が必要です。 shutdown()を再利用するために毎回picassoインスタンスを再初期化することを忘れないでください

0
Amol Desai
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));
0
JoeSpin