Недействительный кеш в Picasso
Загружаю образ с диска Picasso, например Picasso.with(ctx).load(new File("/path/to/image")).into(imageView)
, но всякий раз, когда я сохраняю новое изображение в этом файле и обновляю свой ImageView
, Пикассо все еще имеет кеш-память.
Возможно ли отменить кеш в Picasso?
Ответы
Ответ 1
В последних версиях Picasso появился новый метод для недействительности без каких-либо обходных решений, поэтому я думаю, что пользовательский класс PicassoTools, упомянутый ранее, теперь устарел в этом случае
Picasso.with(getActivity()).invalidate(file);
Ответ 2
На самом деле, исходя из вашего собственного ответа, есть более простой способ сделать это, не открывая библиотеку. Добавьте этот класс в пакет 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));
Ответ 3
Отмените кеш кеша и проверку кеша диска, указав политику памяти по флагом: 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);
Ответ 4
Попробуйте использовать:
Picasso.with(ctx).load(new File("/path/to/image")).skipMemoryCache().into(imageView)
Ответ 5
Другой вариант - удалить сам каталог кеша, например, при запуске приложения:
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".
Ответ 6
Что вы можете сделать, если хотите удалить весь кеш сразу, это создать пользовательский Picasso.LruCache
, а затем использовать для него метод clear
.
Вот пример:
Picasso.Builder builder = new Picasso.Builder(this);
LruCache picassoCache = new LruCache(this);
builder.memoryCache(picassoCache);
Picasso.setSingletonInstance(builder.build());
Чтобы очистить кеш:
picassoCache.clear();
Ответ 7
Порядок поиска изображения в 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.Убедитесь в кеш кеша и кеш диска Offline
※ примечание: Оффлайн означает, что обновление не обновляется до ImageView, просто извлечение фона для использования позже
※ Примечание. Использование fetch() хорошо, но оно также потребляет сетевой ресурс, поэтому, пожалуйста, внимательно рассмотрите, проверьте сценарий 4 ниже для лучшего решения
4.Убедитесь в кеш кеша и кеш диска Оффлайн, если существует дисковый кэш
- Случай пользователя: только недействительный кеш, если он уже существует в кеше диска
-
Решение. Следует проверить диск с помощью параметра: NetworkPolicy.OFFLINE cache перед извлечением
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 для управления кешем в будущем будущем.
Ответ 8
Вы можете очистить кеш изображения от 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();
Ответ 9
Не слишком красиво, но этот подход устранил мою проблему с кешем и 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);
Ответ 10
Другой вариант - сохранить новое изображение в другом файле, чем оригинал. Так как кэш-память Picasso отключена от пути к файлу, загрузка нового изображения из другого файла приведет к промаху в кеше. Это также имеет преимущество в том, что вам не нужно очищать весь кеш.
Ответ 11
используйте 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()
его, чтобы повторно использовать его
Ответ 12
File f = new File(path, name);
Picasso.with(this).invalidate(Uri.fromFile(f));
Ответ 13
В принятом ответе здесь очень важная часть отсутствует. Я нашел трюк из этого: 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()) недействительным (fileUri);.
Надеюсь, это поможет.
Ответ 14
Вы можете пропустить кеш памяти 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"