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