Кэш исходного изображения не используется повторно при применении преобразования в Picasso - PullRequest
1 голос
/ 03 июня 2019

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

Я ожидаю, что Picasso должен автоматически повторно использовать исходное обналиченное изображение, чтобы применить преобразование и перезагрузить его без задержки. Может быть, я что-то упустил.

Вот код загрузки изображения.

 private fun loadOriginalImage(i: Product, productImage: ImageView) {
    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
        .error(R.color.light_grey).fit().centerCrop().into(productImage)
}


 private fun loadGreyedImage(i: Product, productImage: ImageView) {
    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
        .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)
}

версия Пикассо implementation 'com.squareup.picasso:picasso:2.71828'

Ответы [ 2 ]

1 голос
/ 09 июня 2019

После включения журналов я убедился, что исходное изображение действительно было кэшировано и, как предположил @Sputnik, проблема, по-видимому, была вызвана задержкой в ​​создании преобразованного растрового изображения из исходного кэша изображений.

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

Таким образом, после игры с Пикассо и журналами, решение, которое работает для меня, состояло в том, чтобы использовать исходное изображение в качестве заполнителя.

так вместо

    Picasso.get().load(getProductUrl(i.id)).placeholder(R.color.light_grey)
    .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)

Я сделал это

    Picasso.get().load(getProductUrl(i.id)).placeholder(productImage.drawable)
    .error(R.color.light_grey).fit().centerCrop().transform(GrayScaleTransform()).into(productImage)

Таким образом, мой заполнитель - это исходное изображение, которое делает переход плавным и избавляет от возможных накладных расходов благодаря кэшированию всех преобразованных изображений.

1 голос
/ 05 июня 2019

Был ли это кеш памяти или дисковый кеш?Как вы убедились, что кеш действительно не использовался?

Здесь есть несколько вариантов (учитывая, что MemoryPolicy и NetworkPolicy не были изменены и вы не заменили стандартный клиент okHTTP3):

  • Изображение было вытеснено из кеша памяти между этими двумя вызовами (слишком маленький кеш, недопустимый вызов и т. Д.)
  • Кэш диска находится под контролем клиента HTTP и не имеет никакого отношения к Picasso, поэтому неправильная настройка заголовков http можетвызвать это (но в этом случае исходное изображение уже должно быть удалено из кэша памяти)

Включение индикаторов и ведение журнала может дать больше информации о происходящем:

Picasso  
.with(context)
.setIndicatorsEnabled(true)
.setLoggingEnabled(true)

Кроме того, если есть возможность выполнить только эти два вызова, вы можете выполнить их и извлечь данные моментального снимка из кэша памяти, чтобы проверить его размер, попадания и пропуски и т. Д.: * 10101 *

StatsSnapshot stats = Picasso.with(context).getSnapshot();  
Log.d("stats", stats.toString());  

Это может датьбольше отладочной информации для рассмотрения, например, было ли в кэше ровно два вызова или нет, была ли ошибка и т. д.

Редактировать:правильно ли реализована функция key () в вашем преобразовании?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...