Picassoでキャッシュを無効にします
-
21-12-2019 - |
質問
picasso を使用してディスクから画像をロードします。たとえば、そのファイルに新しいイメージを保存するたびに、Picassoでは、Picasso.with(ctx).load(new File("/path/to/image")).into(imageView)
を更新してください.Picassoはまだビットマップをキャッシュしています。
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)
. 別のオプションは、たとえばアプリの起動時にキャッシュディレクトリ自体を削除することです。
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.LruCache
を作成してから、clear
メソッドを使用します。
これはサンプルです:
Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
.
キャッシュをクリアするには:
picassoCache.clear();
. Picassoの検索画像の順序は次のとおりです。 メモリキャッシュ - >ディスクキャッシュ - >ネットワーク
だからPicassoでキャッシュを無効にする必要があるシナリオはほとんどありません:
1.Validateメモリキャッシュ:
- usercase:画像キャッシュまたはリモートホストですでに更新されているとき
-
解決策:URL、ファイル、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.メモリキャッシュとディスクキャッシュを使用する オフライン
※注:オフライン平均更新プログラムImageViewへの更新、後で使用する背景フェッチ
- ユーザーケース:リモートホストのイメージを更新しましたが、その後のキャッシュのみをアップデートするだけです(イメージビューに更新しない)
-
解決策:フェッチのみ
mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.NO_CACHE) .fetch();
※注:FETCH()を使用することは良いですが、ネットワークリソースを消費するので、慎重に検討してください。
4.メモリキャッシュとディスクキャッシュとディスクキャッシュ オフライン
- ユーザーの場合:ディスクキャッシュ に既存の場合は無効なキャッシュのみ
-
解決策:パラメータを使用してディスクをチェックする必要があります.fetch
の前にNetworkPolicy.Offlineキャッシュ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は素晴らしいlibsです、私はSquareupが今後の将来のキャッシュを管理するためにより便利なAPIを追加します。
独自のキャッシュを設定してそれをクリアすることで、Picassoの画像キャッシュをクリアできます。 このコードは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();
. はかわいいですが、このアプローチは私の問題をキャッシュとPicassoで修正しました。特定の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);
. ここで受け入れられている答えから非常に重要な部分がありません。私はここからのトリックを見つけました:
次の行を呼び出すだけでは、オリジナルのイメージを表示するときにサイズ変更、センタークロップなどのようなカスタムオプションを使用するときに写真のキャッシュを消去しません。
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);
.
これが役立つことを願っています。
You can skip memory cache by skipMemoryCache()
see the following
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"
Another option is to save the new image into a different file than the original. Since the Picasso bitmap cache is keyed off of the file path, loading the new image from a different file will result in a cache miss. This also has the side benefit of not having to clear the entire cache.
use shutdown()
instead
As per source code; shutdown will stop accepting further request as well as clear all cache
/** 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;
}
Also you can not shutdown singleton instance.
So you need to have instance variable for Picasso
. Do not forget to reinitialize picasso instance everytime you shutdown()
it in order to reuse it
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));