Очистить диск / SD-карту кэш-памяти библиотеки изображений Picasso от Android

Я использую Picasso для загрузки изображений с моего сервера. Он отлично работает, но я загружаю изображение и позже меняю его. Но Picasso имеет изображение, кэшированное где-то на диске (я проверил SD-карту и не смог найти директорию, в которой хранится Picasso).

Я попытался удалить кеш, как было предложено принятым ответом на этот вопрос: Invalidate cache in Picasso

Я также попытался пропустить кеш при загрузке изображений, используя: Picasso.with (ctx) .load (новый файл («/ путь / в / образ»)). SkipMemoryCache (). В (imageView)

Но ни один из этих методов не работает.

Спасибо за любое предложение или подсказку, которые могут помочь мне решить эту проблему.

Solutions Collecting From Web of "Очистить диск / SD-карту кэш-памяти библиотеки изображений Picasso от Android"

Изображения диска Picasso кэшируются в каталоге внутреннего кэша приложения. Посмотрите на метод createDefaultCacheDir здесь https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/Utils.java

Вы можете очистить все изображения в getCacheDir/picasso-cache как это

  public boolean clearImageDiskCache() { File cache = new File(mContext.getApplicationContext().getCacheDir(), "picasso-cache"); if (cache.exists() && cache.isDirectory()) { return deleteDir(cache); } return false; } 

Чтобы удалить все файлы в каталоге

 public static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } // The directory is now empty so delete it return dir.delete(); } 

Вы можете прочитать эту запись https://stackoverflow.com/a/18964588/2358095, чтобы понять, как работает picasso disk cache.

Поэтому прежде всего вам нужно добавить метод static void delete(Object cache) в классе ResponseCacheIcs. Этот класс определен в UrlConnectionDownloader.java. Кажется, что:

 private static class ResponseCacheIcs { static Object install(Context context) throws IOException { File cacheDir = Utils.createDefaultCacheDir(context); HttpResponseCache cache = HttpResponseCache.getInstalled(); if (cache == null) { long maxSize = Utils.calculateDiskCacheSize(cacheDir); cache = HttpResponseCache.install(cacheDir, maxSize); } return cache; } static void close(Object cache) { try { ((HttpResponseCache) cache).close(); } catch (IOException ignored) { } } static void delete(Object cache) { try { ((HttpResponseCache) cache).delete(); } catch (IOException ignored) { } } } 

После этого вы должны добавить

 void clearDiskCache(); 

Метод в Downloader.java. Затем вы должны добавить нереализованный метод в UrlConnectionDownloader.java и OkHttpDownloader.java. Вы должны определить public void clearDiskCache() метод public void clearDiskCache() в UrlConnectionDownloader.java следующим образом:

 @Override public void clearDiskCache() { // TODO Auto-generated method stub if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && cache != null) { ResponseCacheIcs.delete(cache); } } 

Затем вы должны добавить:

 void clearDiskCache(){ downloader.clearDiskCache(); } 

Метод в Dispacher.java. Затем добавьте:

 public void clearDiskCache(){ dispatcher.clearDiskCache(); } 

Метод в Picasso.java.

Бинго !!! Теперь вы можете вызвать clearDiskCache() в вашем коде. Вот пример:

 Picasso picasso = Picasso.with(TestActivity.this); picasso.clearDiskCache(); picasso.setDebugging(true); picasso.setIndicatorsEnabled(true); picasso.setLoggingEnabled(true); picasso.load(imageURL).into(imageView);