web-dev-qa-db-ja.com

ピカソのキャッシュメモリをクリアする

Androidコーディングにより、Picassoのキャッシュメモリをクリアしようとしています。

誰でもこの問題で私を助けてください..?

私は次のコードを使用しようとしましたが、これは私の場合には役に立ちませんでした:

Picasso.with(getActivity()).load(data.get(pos).getFeed_thumb_image()).skipMemoryCache().into(image);
12
Parthiban M

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);
9
Parthiban M

代わりにこれを使用してください:

 Picasso.with(getContext()).load(data.get(pos).getFeed_thumb_image()).memoryPolicy(MemoryPolicy.NO_CACHE).into(image);
32
Mohamed

このようにピカソのキャッシュを削除します。

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);
_

この助けを願っています。

4
khaintt

指定された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()); }からの抜粋

2
Devendra Vaja

私は同じ問題を抱えていました。それは私のために働いた。 ダイアログ内の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() {

                }
            });
0
Cunity

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()メソッドでキャッシュをクリアします。

0
 Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv);

これも機能します

0
Rushi Ayyappa