Androidコーディングにより、Picassoのキャッシュメモリをクリアしようとしています。
誰でもこの問題で私を助けてください..?
私は次のコードを使用しようとしましたが、これは私の場合には役に立ちませんでした:
Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image);
json(dbから)経由でイメージをロードしようとしている場合は、より良い結果を得るためにnetworkCacheをクリアしてみてください。
Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.placeholder(R.drawable.bv_logo_default).stableKey(id)
.into(viewImage_imageView);
代わりにこれを使用してください:
Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
このようにピカソのキャッシュを削除します。
public class Clear {
public static void clearCache (Picasso p) {
p.cache.clear();
}
}
このutilクラスは、キャッシュをクリアできます。あなたはそれを呼び出す必要があります:
Clear.clearCache(Picasso.with(context));
[〜#〜] edit [〜#〜]:
Clearクラスはパッケージに含まれている必要があります。
package com.squareup.picasso;
キャッシュはそのパッケージの外部からアクセスできないためです。この答えのように: https://stackoverflow.com/a/23544650/4585226
アクティビティが破壊されると、残念ながらピカソを使用している場合、ビットマップはリサイクルされませんでした。イメージビューに読み込まれたビットマップをプログラムでリサイクルしようとしています。 Target
を使用して、ロードされたビットマップを参照する方法があります。
_ Target mBackgroundTarget = new Target() {
Bitmap mBitmap;
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
if (bitmap == null || bitmap.isRecycled())
return;
mBitmap = bitmap;
mBgImage.setImageBitmap(bitmap);
mHandler.post(new Runnable() {
@Override
public void run() {
// Do some animation
}
});
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
recycle();
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
/**
* Recycle bitmap to free memory
*/
private void recycle() {
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
mBitmap = null;
System.gc();
}
}
};
_
そして、アクティビティが破棄されると、onBitmapFailed(null)
を呼び出して、ロードされたビットマップをリサイクルします。
_@Override
protected void onDestroy() {
super.onDestroy();
try {
if (mBackgroundTarget != null) {
mBackgroundTarget.onBitmapFailed(null);
Picasso.with(context).cancelRequest(mBackgroundTarget);
}
} catch (Exception e) {
e.printStackTrace();
}
}
_
ただし、この場合はメモリ内の画像をキャッシュしないでください。リサイクルビットマップ例外を使用することになります。
_Picasso.with(context)
.load(imageUrl)
.resize(width, height)
.memoryPolicy(MemoryPolicy.NO_CACHE)
.into(mBackgroundTarget);
_
この助けを願っています。
指定されたUriで画像を更新する場合は、完全なキャッシュをクリアする代わりに。このPicasso.with(context).invalidate(uri);
を試してください。Picassoが保持するキャッシュからキーを内部的に削除します。
Picasso.Java
/** * Invalidate all memory cached images for the specified {@code uri}. * * @see #invalidate(String) * @see #invalidate(File) */ public void invalidate(Uri uri) { if (uri == null) { throw new IllegalArgumentException("uri == null"); } cache.clearKeyUri(uri.toString()); }
からの抜粋
私は同じ問題を抱えていました。それは私のために働いた。 ダイアログ内のRecycleViewのPicassoを使用しました。ダイアログを閉じたときに、ピカソがキャッシュをクリアしません。しかしダイアログを使用している間、画像キャッシュをクリアします。ただし、クリアされないキャッシュがいくつかあります。クリアされなかったキャッシュが、dialog.dismiss()の前にダイアログで最後に表示された可能性があります。
このmemoryPolicy(MemoryPolicy.NO_CACHE、MemoryPolicy.NO_STORE)を使用します
Picasso.with(activity).load(file).resize(100,100).centerCrop().memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE).into(contactImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
customDownloader
実装の参照を保持する場合、キャッシュをクリアできます。
_public class PicassoUtil {
private static Picasso sInstance;
private static OkHttp22Downloader sDownloader;
public static Picasso getPicasso(Context context){
if(sInstance == null) {
sDownloader = new OkHttp22Downloader(context)
Picasso.Builder builder = new Picasso.Builder(context);
builder.downloader(sDownloader);
sInstance = builder.build(sDownloader);
}
return sInstance;
}
public static void clearCache(){
if(sDownloader != null){
sDownloader.clearCache();
}
}
}
_
HttpクライアントとそのCache
にアクセスすることが重要です。私の実装ではキャッシュにアクセスできるため、clearCache()
メソッドでキャッシュをクリアします。
Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);
これも機能します