Picasso 、たとえばPicasso.with(ctx).load(new File("/path/to/image")).into(imageView)
を使用してディスクから画像をロードしますが、そのファイルに新しい画像を保存し、ImageView
を更新するたびに、ピカソはビットマップをキャッシュします。
Picassoでキャッシュを無効にすることはできますか?
Picassoの最近のバージョンでは、回避策なしで無効化する新しいメソッドがあります。そのため、この場合、前述のカスタムPicassoToolsクラスは廃止されたと思います。
Picasso.with(getActivity()).invalidate(file);
実際、あなた自身の答えに基づいて、ライブラリをフォークせずにそれを行う簡単な方法があります。このクラスを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));
以下のコードスニペットのように、フラグ: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)
すべてのキャッシュを一度に削除する場合にできることは、カスタムPicasso.LruCache
を作成し、それに対してclear
メソッドを使用することです。
サンプルを次に示します。
Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
キャッシュをクリアするには:
picassoCache.clear();
別のオプションは、たとえばアプリの起動時にキャッシュディレクトリ自体を削除することです。
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」をパスに追加します。
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を追加することを願っています。
独自のキャッシュを設定してピカソの画像キャッシュをクリアし、クリアできます。このコードは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();
きれいにループしませんが、このアプローチはキャッシュとピカソの問題を修正しました。特定の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);
ここで受け入れられている答えには非常に重要な部分が欠けています。ここからトリックを見つけました: 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);
これが役立つことを願っています。
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"
別のオプションは、新しいイメージを元のファイルとは異なるファイルに保存することです。 Picassoビットマップキャッシュはファイルパスからキーオフされているため、別のファイルから新しいイメージをロードすると、キャッシュミスが発生します。これには、キャッシュ全体をクリアする必要がないという副次的な利点もあります。
ソースコードごとに、代わりに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インスタンスを再初期化することを忘れないでください
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));