Intereting Posts
Анимация двухслойных графических элементов Pre-Honeycomb Android Удалите клавиатуру при касании списка Построение приложения Ionic не удалось из-за Crosswalk Android. Как взять EditText (числа), затем преобразовать его в целое число, чтобы использовать его для математики? Как исправить – «Эта версия приложения не настроена для выставления счетов на рынке»? Пользовательская кнопка на ActionBar Android-камера Intent не возвращается в случае RESULT_OK Уведомление о push-канале GCM вызывает 502 Bad Gateway Java.io.FileNotFoundException: этот файл нельзя открыть в качестве дескриптора файла; Он, вероятно, сжат Можете ли вы установить несколько соединений Bluetooth между одними и теми же двумя устройствами в Android? Отправляет ли Google Play уведомление об обновлении бета-тестеров? SurfaceHolder.setFormat (PixelFormat.RGBA_8888) не работает на некоторых устройствах, а не на других Поведение статической переменной android при сбое приложения Android / Java: длинный получает отрицательный, не превышая max_value Вкладка со значком с помощью TabLayout в библиотеке Android Design

Недействительный кеш в Picasso

Я загружаю образ с диска с помощью Picasso , например, Picasso.with(ctx).load(new File("/path/to/image")).into(imageView) , но всякий раз, когда я сохраняю новое изображение в этом файле, И обновите мой ImageView , у Пикассо все еще есть кеш-память.

Возможно ли отменить кеш в Picasso?

Solutions Collecting From Web of "Недействительный кеш в Picasso"

В последних версиях Picasso существует новый метод для недействительности без каких-либо обходных решений, поэтому я считаю, что пользовательский класс PicassoTools, упомянутый ранее, теперь устарел в этом случае

 Picasso.with(getActivity()).invalidate(file); 

На самом деле, исходя из вашего собственного ответа, есть более простой способ сделать это, не открывая библиотеку. Добавьте этот класс в пакет com.squareup.picasso.

 package com.squareup.picasso; public class PicassoTools { public static void clearCache (Picasso p) { p.cache.clear(); } } 

Поскольку кеш имеет видимость пакета, этот класс util может очистить кэш для вас. Вам просто нужно позвонить:

 PicassoTools.clearCache(Picasso.with(context)); 

Отмените кеш кеша и проверку кеша диска, указав политику памяти по значению: emoryPolicy.NO_CACHE и NetworkPolicy.NO_CACHE, как показано ниже:

  mPicasso.with(mContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE ) .networkPolicy(NetworkPolicy.NO_CACHE) .resize(512, 512) .error(R.drawable.login) .noFade() .into(imageView); 

Попробуй использовать:

 Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView) 

Другой вариант – удалить сам каталог кэша, например, при запуске приложения:

 deleteDirectoryTree(context.getCacheDir()); 

где:

 /** * Deletes a directory tree recursively. */ public static void deleteDirectoryTree(File fileOrDirectory) { if (fileOrDirectory.isDirectory()) { for (File child : fileOrDirectory.listFiles()) { deleteDirectoryTree(child); } } fileOrDirectory.delete(); } 

Это удалит всю директорию кэша, что прекрасно, если вы хотите имитировать первое использование своего приложения. Если вы хотите удалить кеш Picasso, добавьте к пути «picasso-cache».

Что вы можете сделать, если хотите удалить весь кеш сразу, это создать пользовательский Picasso.LruCache , а затем использовать на нем метод clear .

Вот пример:

 Picasso.Builder builder = new Picasso.Builder(this); LruCache picassoCache = new LruCache(this); builder.memoryCache(picassoCache); Picasso.setSingletonInstance(builder.build()); 

Чтобы очистить кеш:

 picassoCache.clear(); 

Не слишком красиво, но этот подход устранил мою проблему с кешем и Picasso. Используйте это только в том случае, если вы хотите сделать недействительным кеш для определенного URL-адреса, этот подход медленный и, вероятно, не правильный способ работы, но работает для меня.

  String url = "http://www.blablabla.com/Raiders.jpg"; Picasso.with(this).invalidate(url); Picasso.with(this) .load(url) .networkPolicy( NetworkUtils.isConnected(this) ? NetworkPolicy.NO_CACHE : NetworkPolicy.OFFLINE) .resize(200, 200) .centerCrop() .placeholder(R.mipmap.ic_avatar) .error(R.mipmap.ic_avatar) .into(imageView); 

Вы можете очистить кеш изображения от picasso, установив свой собственный кеш и очистив его. Этот код был протестирован на Picasso 2.5.0

 private Picasso picasso; private LruCache picassoLruCache; picassoLruCache = new LruCache(context); // Set cache picasso = new Picasso.Builder(context) // .memoryCache(picassoLruCache) // .build(); // Clear cache picassoLruCache.clear(); 

Порядок поиска изображения в Picasso: Кэш памяти -> Кэш диска -> Сеть

Таким образом, есть несколько сценариев, которые нам нужны для недействительности кеша в Picasso:

1. Неверный кеш памяти:

  • Usercase: когда изображение уже обновляется в кеше диска или удаленном хосте
  • Решение. Очистите кеш Url, File, Uri, если они существуют.

     mPicasso.with(appContext).invalidate(File); mPicasso.with(appContext).invalidate(Url); mPicasso.with(appContext).invalidate(Uri); 

,

2. Неверный кеш памяти и кеш диска.

※ примечание: онлайн среднее обновление непосредственно в ImageView

  • Случай пользователя: изображение обновлено на удаленном хосте

  • Решение. Прервите изображение в кеше и кеше диска, затем запросите изображение на удаленном хосте.

     mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE ) .networkPolicy(NetworkPolicy.NO_CACHE) .into(imageView); 

    -> Отменить кеш памяти и кэш диска

,

3.Инвестировать кеш памяти и кеш диска в автономном режиме

※ примечание: автономное среднее обновление не обновляется до ImageView, просто извлечение фона для использования позже

  • Случай пользователя: вы знаете, что изображение на удаленном хосте обновлено, но нужно только обновлять кеш только после использования (не обновлять изображение)
  • Решение: извлечь только

      mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.NO_CACHE) .fetch(); 

※ Примечание. Использование fetch () является хорошим, но оно также потребляет сетевой ресурс, поэтому, пожалуйста, внимательно рассмотрите сценарий 4 ниже для лучшего решения

4. Неверный кеш памяти и кеш диска Оффлайн, если существует кеш диска

  • Случай пользователя: только недействительный кеш, если он уже существует в кеше диска
  • Решение. Если вы проверяете диск, используя параметр: кеш NetworkPolicy.OFFLINE перед извлечением

      mPicasso.with(appContext) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.OFFLINE) .fetch(new Callback() { @Override public void onSuccess() { //Success: mean disk cache exist -> should do actual fetch picasso.load(url).fetch(); } @Override public void onError() { //Failed: mean disk cache not exist } }); 

Picasso – это удивительные библиотеки, я надеюсь, что квадрат добавит больше удобства API для управления кешем в будущем будущем.

Другой вариант – сохранить новое изображение в другом файле, кроме оригинала. Так как кэш-память Picasso отключена от пути к файлу, загрузка нового изображения из другого файла приведет к промаху в кеше. Это также имеет побочное преимущество в том, что вам не нужно очищать весь кеш.

Используйте shutdown() вместо этого в соответствии с исходным кодом; Shutdown перестанет принимать дополнительный запрос, а также очистить весь кеш

  /** Stops this instance from accepting further requests. */ public void shutdown() { if (this == singleton) { throw new UnsupportedOperationException("Default singleton instance cannot be shutdown."); } if (shutdown) { return; } cache.clear(); cleanupThread.shutdown(); stats.shutdown(); dispatcher.shutdown(); for (DeferredRequestCreator deferredRequestCreator : targetToDeferredRequestCreator.values()) { deferredRequestCreator.cancel(); } targetToDeferredRequestCreator.clear(); shutdown = true; } 

Также вы не можете отключить экземпляр singleton. Поэтому вам нужно иметь переменную экземпляра для Picasso . Не забудьте повторно инициализировать экземпляр picasso каждый раз при shutdown() , чтобы повторно использовать его

 File f = new File(path, name); Picasso.with(this).invalidate(Uri.fromFile(f)); 

Здесь очень важная часть отсутствует в принятом ответе. Я нашел трюк из этого: http://blogs.candoerz.com/question/124660/android-image-cache-is-not-clearing-in-picasso.aspx

Просто вызывая следующую строку, не будет очищать кеш фото, когда вы используете настраиваемые параметры, такие как изменение размера, центровка и т. Д. При отображении исходного изображения. . Picasso.with (getContext ()) недействительным (файл);

Решение:

При отображении изображения используйте параметр stableKey ().

Picasso.with (getContext ()). Load (новый файл (fileUri)). SkipMemoryCache (). Placeholder (R.drawable.placeholder) .stableKey (fileUri) .into (imageview);

Затем вы можете очистить кеш этого файла позже, вызвав это: Picasso.with (getContext ()). Invalidate (fileUri);

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

Вы можете пропустить кеш памяти с помощью skipMemoryCache()

См. Следующие

  Picasso.with(this) .load(IMAGE_URL) .skipMemoryCache() .placeholder(R.drawable.placeholder) .error(R.drawable.no_image) .into(mImageViewPicasso); 

Gradle compile "com.squareup.picasso:picasso:2.4.0"