Picasso Image загружен снова для ImageView с различными размерами?

Я использую Picasso в своем приложении для эффективной загрузки изображения и делаю его работу в лучшем случае. Проблема в том, что в настоящее время, если я Picasso.with() называть Picasso.with() несколько раз с тем же URL-адресом, однако каждый раз с представлением изображения, имеющим разные Размеры, изображение загружается снова. В Glide у нас есть методы .diskCacheStrategy() с DiskCacheStrategy.SOURCE для решения проблемы. Есть ли альтернативный способ в Picasso?

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

Это код, который я использую

 Picasso.with(context) .load(URI) .placeholder(R.drawable.ic_profile_thumb) .resize(180, 180).centerInside() .into(viewHolder.imgThumbnail); , Picasso.with(context) .load(URI) .placeholder(R.drawable.ic_profile_thumb) .resize(180, 180).centerInside() .into(viewHolder.imgThumbnail); 

Solutions Collecting From Web of "Picasso Image загружен снова для ImageView с различными размерами?"

Picasso не кэширует изображение на диск, Picasso имеет только кэш памяти. Кэш диска выполняется сетевой библиотекой (OKhttp). Поэтому изображение, записанное в кеш диска, никогда не изменяется.

Если один и тот же URL-адрес загружается несколько раз, когда вам, возможно, придется проверить свою сетевую библиотеку.

Если ваш проект использует библиотеку okhttp, то picasso автоматически будет использовать его в качестве загрузчика по умолчанию. Если вы используете какую-либо другую сетевую библиотеку, вам придется написать свой собственный загрузчик и установить его, используя

 Picasso.Builder(context).downloader(customDownloader) 

Эта ссылка может прояснить ситуацию

Picasso по умолчанию не изменяет размер изображений. Если вы сделаете простой вызов, как следующий …

 Picasso.with(context).load("https://goo.gl/v9EkbF").into(imageView); 

… Picasso кэширует полноразмерное изображение. С этого момента каждый раз, когда вы вызываете один и тот же URL-адрес, Picasso будет повторно использовать полноразмерное изображение и позволить графическому процессору изменять размер изображения в представлении.

Используйте метод resize (), который вы только кешируете измененное изображение, и Picasso нужно будет снова загрузить изображение, если вы используете другой размер.

Не используйте параметр resize (), и вы получите более широкое использование полосы пропускания, но будьте осторожны с использованием памяти.

По умолчанию в Picasso

У Picasso есть автоматическая память и кэширование диска . Любое изображение, которое было запрошено в последнее время, будет в кеше памяти. Если это не так, Picasso проверит кеш диска. Если он недоступен на диске, только тогда Picasso запустит сетевой запрос.

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

По умолчанию в 2.5.2 указаны:

  • Кэш LRU объемом 15% – доступное прикладное ОЗУ
  • Дисковый кэш объемом 2% хранения до 50 МБ, но не менее 5 МБ.
  • Picasso будет использовать OkHttp как клиент Http, если он включен как зависимость Gradle. В противном случае Пикассо вернется к HttpUrlConnection.

Вы можете увеличить кеш диска таким образом (пример для 100 МБ):

  Picasso picasso = new Picasso .Builder(this) .downloader(new OkHttpDownloader(getCacheDir(), 100000000)) .build(); Picasso.setSingletonInstance(picasso); 

Изменение размера кеша диска не изменяет политику кэширования.

Политики памяти

  • MemoryPolicy.NO_CACHE: изображение не будет обслуживаться из памяти. Это не позволяет избежать изображений с диска. Чтобы избежать просмотра диска в сетевых политиках .
  • MemoryPolicy.NO_STORE: изображение не будет сохранено в памяти. Используйте это для изображений, которые будут загружены только один раз.

пример

 Picasso .with(context) .load(https://goo.gl/v9EkbF) .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE) .into(imageView); 

Сетевые политики

  • NetworkPolicy.NO_CACHE: образ не будет обслуживаться из дискового кэша.
  • NetworkPolicy.OFFLINE: изображение будет (если возможно) подаваться только из кеша (памяти или диска), но никогда из сети.

Пример:

 Picasso .with(context) .load(https://goo.gl/v9EkbF) .networkPolicy(NetworkPolicy.NO_CACHE) .into(imageView); 

Вопросы памяти и кеширования

  • Glide использует по умолчанию RGB565 и кэширует изображение, измененное в памяти.
  • Picasso использует по умолчанию RGB888 и кэширует полноразмерное изображение в память и позволяет графическому процессору в реальном времени изменять размер при рисовании.

RGB565 составляет половину от размера RGB888. Результатом использования RGB565 и меньших изображений является то, что площадь памяти Пикассо выше (может быть 3x / 4x), чем у Glide.

Это только значения по умолчанию. Glide можно настроить для использования RGB888 и Picasso для использования RGB565. Picasso может быть сконфигурирован так, чтобы вбрасывать в память только измененные изображения, такие как Glide.

При тех же настройках объем памяти практически одинаковый.

Пространство

  • Glide кэширует отдельный файл для каждого размера. Если вы загружаете другой размер одного и того же изображения, он будет загружен снова до, изменен и затем будет сохранен в кеше.
  • Picasso всегда использует полноразмерное изображение из кеша, а затем позволяет графическому процессору изменять размер изображения в представлении.

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

Заметка

Picasso 2.6 подходит, и я понятия не имею, что нового / нового.

источники

  • Пикассо
  • Введение в Glide, Image Loader Library для Android, рекомендованное Google
  • Что такое политика кэширования по умолчанию?
  • Пикассо – Влияние кэширования изображений

Вы можете использовать OkHttp от того же поставщика «SquareUp».
Этот ответ показывает вам, как это сделать с подробностями.

UPDATE: ссылки были старыми, кстати, вот изменения в самых новых версиях:

https://github.com/square/picasso/blob/master/CHANGELOG.md

И, как сказал @Sotti, у Picasso есть Automatic memory and disk caching котором они упомянули об этом в разделе «Введение»: (последняя часть) **

http://square.github.io/picasso/#introduction


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

На самом деле у Picasso только кеш памяти , но для этого вы можете использовать OkHttp .

Проверьте эту ссылку: https://stackoverflow.com/a/18552559/4409113 Что говорит:

Если вы ссылаетесь на дисковый кеш, тогда Picasso не поддерживает это в настоящий момент . Это по дизайну, потому что кэш уровня диска выполняется с помощью уровня HTTP layer и не делает различий в нем.

Проверьте это тоже: https://corner.squareup.com/2013/05/picasso-one-dot-oh.html

Picasso автоматически использует кеш памяти и диска ( предоставляемый HTTP client ) для ускорения загрузки битмапа. Для разработки вы можете включить отображение цветного маркера, который указывает на источник изображения.

А также, проверьте этот вопрос: Как реализовать свой собственный кеш диска с библиотекой picasso – Android?

Чтобы сохранить файлы в пользовательском кеш-каталоге, используя OkHttp :

 OkHttpClient okHttpClient = new OkHttpClient(); File customCacheDirectory = new File(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/MyCache"); okHttpClient.setCache(new Cache(customCacheDirectory, Integer.MAX_VALUE)); OkHttpDownloader okHttpDownloader = new OkHttpDownloader(okHttpClient); Picasso picasso = new Picasso.Builder(mainActivity).downloader(okHttpDownloader).build(); picasso.load(imageURL).into(viewHolder.image); 

От: https://stackoverflow.com/a/33276054/4409113

Как вы можете видеть, используется setCache .


Вы можете использовать Universal Image Loader и библиотеку # 1 для изображений.

 https://github.com/nostra13/Android-Universal-Image-Loader