Picasso Image загружен снова для ImageView с различными размерами?
Я использую Picasso в своем приложении для эффективной загрузки изображения и делаю его работу в лучшем случае. Проблема в том, что в настоящее время, если я вызываю 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);
Ответы
Ответ 1
Picasso не кэширует изображение на диск, Picasso имеет только кэш памяти. Кэш диска выполняется сетевой библиотекой (OKhttp). поэтому изображение, записанное в кеш диска, никогда не изменяется.
если одно и то же изображение URL-адреса загружается несколько раз, когда вам, возможно, придется проверить свою сетевую библиотеку.
Если ваш проект использует библиотеку okhttp, то picasso автоматически будет использовать его в качестве загрузчика по умолчанию. Если вы используете какую-либо другую сетевую библиотеку, вам придется написать свой собственный загрузчик и установить его с помощью
Picasso.Builder(context).downloader(customDownloader)
эта ссылка может прояснить ситуацию
Ответ 2
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. В противном случае Picasso вернется к 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's.
Это только значения по умолчанию. Glide можно настроить для использования RGB888 и Picasso для использования RGB565. Picasso может быть сконфигурирован так, чтобы вбрасывать в память только измененные изображения, такие как Glide.
При тех же настройках объем памяти почти одинаковый.
Рекомендации по пропускной способности
- Glide кэширует отдельный файл для каждого размера. Если вы загружаете другой размер
то же изображение, оно будет загружено снова до, изменено, а затем
кэшируются.
- Picasso всегда использует полноразмерное изображение из кеша, а затем позволяет графическому процессору изменять размер изображения в представлении.
Вы можете попросить Glide кэшировать все, полноразмерные изображения и измененные изображения, но по умолчанию потребление пропускной способности Glide выше.
Примечание
Picasso 2.6 подходит, и я понятия не имею, что нового/нового.
Источники
Ответ 3
Вы можете использовать OkHttp
у того же поставщика "SquareUp".
Этот ответ показывает вам, как это сделать с подробностями.
Ответ 4
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.how можно повторно использовать образ без повторной загрузки для разных размеры ImageView
.
Фактически, Picasso
имеет кеш памяти, но вы можете использовать для этого OkHttp
.
Отметьте эту ссылку: fooobar.com/questions/358139/... Что говорит:
Если вы ссылаетесь на кеш диска, то ни один 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);
От: fooobar.com/questions/75700/...
Как вы можете видеть, использует setCache
.
Ответ 5
Вы можете использовать Universal Image Loader и библиотеку # 1 для изображений.
https://github.com/nostra13/Android-Universal-Image-Loader