Недействительный кеш в 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, просто извлечение фона для использования позже

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

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

※ Примечание. Использование 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"