Очистить память кэша Пикассо

Я пытаюсь очистить кэш-память Picasso через Android-кодирование.

Может кто-нибудь, пожалуйста, помогите мне в этом вопросе ..?

Я попытался использовать следующий код, но это было бесполезно в моем случае:

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

Solutions Collecting From Web of "Очистить память кэша Пикассо"

Используйте это вместо этого:

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

Когда активность уничтожается, к сожалению, растровое изображение не было переработано, если мы используем Picasso. Я пытаюсь программно переработать растровое изображение, что загружено в изображение. Существует способ ссылки на загруженное растровое изображение с помощью 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(); } } }; 

И когда Activity destroy, я вызываю onBitmapFailed(null) чтобы 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); 

Надеюсь, эта помощь.

Удалите кеш Пикассо так.

 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

Если вы пытаетесь загрузить изображение через Json (из db), попробуйте очистить сетевой кеш для лучшего результата.

 Picasso.with(context).load(uri).networkPolicy(NetworkPolicy.NO_CACHE) .memoryPolicy(MemoryPolicy.NO_CACHE) .placeholder(R.drawable.bv_logo_default).stableKey(id) .into(viewImage_imageView); 

Если вы сохраните ссылку на свою пользовательскую реализацию Downloader вы можете очистить кеш.

 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() метода clearCache() .

У меня такая же проблема. Это сработало для меня. Я использовал Picasso в 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() { } }); 
  Picasso.with(this.getContext()).load(gamePlayer.getPlayerProfileUrl()).skipMemoryCache().into(iv); 

Это также работает

Вместо того, чтобы очистить полный кеш, если хотите обновить изображение с данным 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()); } /** * 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()); }