2016-02-02 1 views
15

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

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

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

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

Проверьте этот ответ http://stackoverflow.com/a/28964219/1384010 .HOpe это поможет вам! –

+0

Не могли бы вы вставить свой код, связанный с Пикассо? Вы используете параметр изменения размера? – Sotti

+0

@Scotti plz проверить мой код. Я использую resize op. – Stella

ответ

8

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

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

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

Picasso.Builder(context).downloader(customDownloader) 

this link может сделать вещи ясно

+0

Можете ли вы, пожалуйста, интерпретировать свой ответ с фактическим кодом для этого беспокойства? Я использую залп в качестве библиотеки n/w. – Stella

+1

- Picasso предлагает автоматическую память и дисковый кеш из коробки. Проверьте мой ответ выше. - AFAIK изображение в кеше диска изменяется, если вы используете метод resize(). – Sotti

+0

@Sotti Picasso не имеет кэш диска. проверьте ответ jake здесь http://stackoverflow.com/questions/23280242/using-picasso-with-custom-disk-cache –

3

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

+0

Итак, если я использую кешированное изображение, когда URL-адрес остается таким же, но просмотр изображения означает то, что я должен сделать, чтобы преодолеть это. Я имею в виду, что в 'glide' мы получили' signature() 'метод любой альтернативы в picasso? – Stella

+0

Либо вы используете OkHttp (который Picasso будет использовать под капотом, если он включен в проект), либо вы используете HttpUrlConnection (что Picasso будет использовать в качестве резервной копии в случае, если OkHttp не включен, и никто другой не определен), политика кэша должна быть и может быть определен через Пикассо, не углубляясь. Основной вопрос/область проблемы не очень ясен для меня, может быть что-то просто, как не использовать метод resize(). – Sotti

-5

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

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

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

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

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

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


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

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

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

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

Проверьте это слишком: https://corner.squareup.com/2013/05/picasso-one-dot-oh.html

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

А также, проверить этот вопрос: How to implement my own disk cache with picasso library - 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.


+1

Я думаю, что стоит отметить, что OkHttp будет по-прежнему кэшировать изображения *, если HTTP-заголовки позволяют кэшировать * - однажды у меня был клиент, жалующийся на то, что изображения не перезагружались каждый день, а затем у файла изображения был заголовок как ' Истекает: Вс, 01 января 2017 00:00:00 GMT'. –

+0

@ david.mihola - Хм, спасибо за обмен опытом. – Mohsen

+1

Ваша ссылка на блог Square составляет 3 года и для версии 1.0. Сегодня версия 2.5.2 не работает, а версия 2.6 находится рядом. Вы можете прочитать на своей веб-странице, что у Пикассо есть «Автоматическая память и кэширование диска». (http://goo.gl/tpTc1) – Sotti

5

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

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

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

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

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

Значение по умолчанию в Пикассо

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

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

По умолчанию в 2.5.2 являются:

  • LRU кэш-памяти 15% имеющихся приложений RAM
  • кэш Диск 2% дискового пространства до 50Мб, но не менее 5 МБ.
  • Picasso будет использовать OkHttp как клиент Http, если он включен как зависимость Gradle. В противном случае Picasso вернется к HttpUrlConnection.

Вы можете увеличить кэш диска, как это (например, для 100MB):

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); 

память и кэширование соображение

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

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

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

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

Bandwidth соображения

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

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

Примечание

Picasso 2.6 приходит, и я понятия не имею о том, что по-другому/новый.

Источники

+0

Любые ссылки на это ?: 'Picasso имеет« Автоматическую память и кеширование диска », я не мог найти это: https://github.com/square/picasso/blob/ master/CHANGELOG.md – Mohsen

+1

@ LinX64: раздел «Введение» -> http://square.github.io/picasso/ – Sotti

+0

Хорошо, это было под всеми элементами, я не видел его :) +1 и спасибо вам за упоминание об этом, я только что обновил ответ – Mohsen