Fresco не обновляет кеш диска изображениями из сети

Я пытался использовать библиотеку Fresco на Facebook.

Из документации я понял, что кэширование изображений работает из коробки с ImagePipelines, когда мы используем SimpleDraweeView. Я в значительной степени вижу, что все работает отлично, только с небольшой заминкой: хотя Fresco извлекает изображения из моего URI, изображения в DiskCache и других кешах не заменяются им.

Я уверен, что мой код извлекает изображения, потому что мои изображения отображаются при первом запуске приложения после очистки кеша, и я реализовал RequestListener и ControllerListener, которые оба оказались успешными.

Вот моя текущая установка:

// Setting the collaborator image.
GenericDraweeHierarchy collaboratorPicHierarchy =
    genericDraweeHierarchyBuilder
         .setPlaceholderImage(
             getInitialsAsDrawable(
                 collaborator.getUser().getInitials()
             )
         )
         .setRoundingParams(new RoundingParams()
             .setRoundAsCircle(true)
         )
         .build();
    holder.collaborator.setHierarchy(collaboratorPicHierarchy);
    holder.collaborator.setImageURI(
        Uri.parse(AltEngine.formURL("user/getProfilePic/") +
            accessToken + "/" +
            collaborator.getUser().getUuid()
        )
);

Весь этот код находится внутри адаптера, и в конструкторе адаптера я инициализировал Fresco.

imagePipelineConfig = ImagePipelineConfig.newBuilder(this.context)
    .build();
Fresco.initialize(this.context, imagePipelineConfig);

После долгих поисков в StackOverflow я обнаружил, что можно использовать следующий фрагмент.

Fresco.getImagePipelineFactory().getMainDiskStorageCache().remove(new SimpleCacheKey(uri.toString()));
Fresco.getImagePipelineFactory().getSmallImageDiskStorageCache().remove(new SimpleCacheKey(uri.toString()));

Я попробовал это в экземпляре onRequestSuccess из ImageRequest, который я связал с SimpleDraweeView, но это привело к тому, что заполнитель отображался каждый раз, когда я обновляю ListView, что плохо.

Следующее решение, которое я нашел, было здесь Android - Как получить файл изображения из кэша диска Fresco? что предполагает, что может быть необходимо реализовать мой собственный DiskCacheConfig для Fresco, чтобы сделать мой DiskCache недействительным, поэтому я попытался настроить свой DiskCache с помощью кода, который я нашел в вопросе SO.

DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder().setBaseDirectoryPath(this.context.getCacheDir())
    .setBaseDirectoryName("v1")
    .setMaxCacheSize(100 * ByteConstants.MB)
    .setMaxCacheSizeOnLowDiskSpace(10 * ByteConstants.MB)
    .setMaxCacheSizeOnVeryLowDiskSpace(5 * ByteConstants.MB)
    .setVersion(1)
    .build();
imagePipelineConfig = ImagePipelineConfig.newBuilder(this.context)
    .setMainDiskCacheConfig(diskCacheConfig)
    .build();
Fresco.initialize(this.context, imagePipelineConfig);

Все равно Кэш не обновляется образом из сети.

Я не знаю, что здесь пошло не так. Может быть, я вообще неправильно понял Фреско. В любом случае, я застрял здесь и не знаю, как действовать дальше. Я просматривал документы пару раз и из-за моего невезения я мог пропустить что-то важное. Пожалуйста, укажите мне правильное направление.


person mahesmohan    schedule 24.06.2015    source источник


Ответы (1)


По сути, это тот же вопрос, что и здесь: https://github.com/facebook/fresco/issues/124.

А на самом деле у вас была примерно правильная идея в двух строчках, которые вы вставили выше с удалением из кеша диска. Вам просто нужно позвонить им в нужном месте. onRequestSuccess не подходит, так как это уничтожит только что скачанный образ.

Вы хотите удалить старую запись из кэша прежде чем отправить запрос на новую. Если Fresco найдет изображение на диске, она даже не отправит сетевой запрос.

person tyronen    schedule 28.06.2015