77

Picassoを使用してディスクから画像を読み込みPicasso.with(ctx).load(new File("/path/to/image")).into(imageView)ますが、そのファイルに新しい画像を保存して を更新するとImageView、Picasso にはまだビットマップがキャッシュされています。

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

4

14 に答える 14

86

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

Picasso.with(getActivity()).invalidate(file);
于 2015-02-15T09:09:08.947 に答える
15

使用してみてください:

Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
于 2014-02-27T18:03:10.247 に答える
13

Picasso で画像を検索する順序は、メモリ キャッシュ -> ディスク キャッシュ -> ネットワークです。

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

1.メモリ キャッシュを無効にします。

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

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

.

2.オンラインでメモリキャッシュとディスクキャッシュを無効化

※注:オンラインとは、ImageView に直接更新することを意味します

  • ユーザー ケース: リモート ホストで更新されたイメージ

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

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

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

.

3.メモリキャッシュとディスクキャッシュを無効化 Offline

※注:オフライン更新とは、ImageView への更新ではなく、後で使用するためのバックグラウンド フェッチのみを意味します

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

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

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

4.メモリキャッシュとディスクキャッシュを無効 にする ディスクキャッシュが存在する場合はOffline

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

     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 を追加することを願っています。

于 2016-10-12T08:51:30.277 に答える
12

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

以下にサンプルを示します。

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

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

picassoCache.clear();
于 2015-03-20T18:42:54.387 に答える
12

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

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」をパスに追加します。

于 2014-07-31T18:50:48.400 に答える
8

独自のキャッシュを設定してクリアすることで、ピカソの画像キャッシュをクリアできます。このコードは 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();
于 2015-12-14T08:36:06.713 に答える
6

きれいにループしませんが、このアプローチにより、キャッシュとピカソに関する問題が修正されました。特定の 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);
于 2015-04-23T02:46:58.077 に答える
0

代わりに使用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。picasso インスタンスshutdown()を再利用するために毎回再初期化することを忘れないでください。

于 2015-12-15T13:59:55.837 に答える
0

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

于 2015-02-14T17:50:41.393 に答える
0
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));
于 2016-07-06T09:22:47.393 に答える