2014-12-16 2 views
11

Я пытаюсь очистить кэш-память Picasso с помощью Android-кодирования.Clear Cache memory of Picasso

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

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

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

еще не проверил, но, 'Picasso.with (контекст) .shutdown()' может быть полезным, я думаю. – activesince93

ответ

3

Если вы пытаетесь загрузить изображение через Json (from 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); 
+0

Что мы делаем для дефолта для тех из нас, кто абстрагирует Пикассо? –

+0

изображение занимает много времени, чтобы загрузить –

8

Удалить кэш Пикассо, как это.

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

+1

Спасибо за ваш ответ. Он выдает ошибку, чтобы изменить метод как нестатический или изменить класс как статический. Также он говорит, что «кеш» не отображается в следующей строке: p.cache.clear(); –

+0

он должен работать. Мы вызываем статический метод открытого класса. –

+2

Я использую только банку Пикассо, и я не использую никаких внешних библиотек picasso. И в нем говорится, что «p.cache» невидим. –

0

Если вы сохраняете ссылку на вашей реализации 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().

29

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

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

Не работает для меня. Поэтому я добавил также .networkpolicy (NetworkPolicy.NO_CACHE). Потом работал. – karan

+0

, если хотите, чтобы кешировать все изображения в течение некоторого времени, но затем очистить весь кеш, когда он мне больше не нужен? – user924

4

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

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

0

У меня была та же проблема. Это сработало для меня. Я использовал 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() { 

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

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

1

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