Локальное решение для кэширования изображений для Android: Square Picasso, универсальный загрузчик изображений, Glide, Fresco?


Я ищу асинхронную библиотеку загрузки и кэширования изображений в Android. Я собирался использовать Picasso, но обнаружил, что универсальный загрузчик изображений более популярен на GitHub. Кто-нибудь знает об этих двух библиотек? Резюме плюсов и минусов было бы здорово.

(все мои изображения находятся на диске локально, поэтому мне не нужна сеть, поэтому я не думаю, что Volley подходит)

5 87

5 ответов:

обновление Sep 2018: через несколько лет мне понадобилось почти то же самое для решения локального кэширования изображений. На этот раз UIL не был в активном развитии. Я сравнил популярные библиотеки, и вывод довольно прост: просто используйте Glide. Это гораздо более мощный и настраиваемый. Много лет назад мне пришлось раскошелиться и внести изменения в UIL. Glide поддерживает все мои варианты использования с точки зрения стратегии кэширования и нескольких уровней кэширования разрешения с пользовательскими ключами. Просто использовать Скользи!

сравнение Koushik Dutta в основном для оценки скорости. Его пост касался только самых элементарных вещей, а не специфических для локальных образов. Я хотел бы поделиться своим опытом с Пикассо и Уил после того, как я задал вопрос. Как Picasso, так и UIL могут загружать локальные изображения. Сначала я попробовал Picasso и был счастлив, но позже я решил переключиться на UIL для получения дополнительных параметров настройки.

Пикассо:

  • свободный интерфейс Пикассо милый. Но прыгая вокруг с "С", "в", "нагрузка" вы на самом деле не знаете, что за сценой. Это сбивает с толку, что возвращается.

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

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

  • вы можно настроить размер кэша памяти. Но его дисковый кэш предназначен только для http-запросов. Для локальных изображений, Если вы заботитесь о скорости загрузки, хорошо иметь кеш диска миниатюр, поэтому вам не нужно каждый раз читать несколько Мб для изображения. Picasso не имеет этого механизма изменения размера и сохранения миниатюр на диске.

  • Picasso не предоставляет доступ к своему экземпляру кэша. (Вы можете получить его, когда вы впервые настроить Picasso и держать его вокруг...).

  • иногда вы хотите асинхронно читать изображение в растровое изображение, возвращаемое слушателем. Удивительно, но у Пикассо этого нет. "fetch ()" доза не передать обратно ничего. "получить ()" - это синхронно читать, и "Load()" для асинхронно нарисовать вид.

  • Picasso имеет только несколько простых примеров на главной странице, и вам придется прочитать неупорядоченный javadoc для advanced использования.

UIL:

  • UIL использует строители для настройки. Почти все можно настроить.

  • UIL не позволяет указать размер, который вы хотите загрузить в представление. Он использует некоторые правила, основанные на размере представления. Это не так гибко, как Пикассо. У меня нет способа загрузить изображение с более низким разрешением, чтобы уменьшить объем памяти. (Изменить: это поведение можно легко изменить, добавив Аргумент ImageSize в исходном коде и обходит проверку размера представления)

  • UIL предоставляет настраиваемый кэш диска, вы можете использовать его для кэширования эскизов с заданным размером. Но это не идеально. Вот такие подробности. (Edit: если вы заботитесь о скорости и хотите использовать несколько уровней кэширования миниатюр, как в моем случае, вы можете изменить исходный код, позволить дисковому кэшу использовать "memoryKey" и сделать его также размером чувствительный)

  • UIL по умолчанию кэширует изображения разных размеров в памяти, и его можно отключить в конфигурации.

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

  • UIL предоставляет гибкие способы получения растрового изображения или загрузки в представление.

  • UIL лучше в документации. UIL дает подробное использование на странице Github, и есть связанный учебник.

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

Если вы читали этой сообщение на G + от Koush вы получите четкие решения для ваших путаниц, я поставил резюме этого, в том, что Android-Universal-Image-Loader является победителем для вашего требования!

  • Пикассо имеет самый хороший API изображения, если вы используете сеть!

  • UrlImageViewHelper + AndroidAsync самый быстрый. Играя с эти другие две большие библиотеки действительно подчеркнули, что API изображений довольно устарел, однако.

  • волейбол гладко; мне очень нравятся их подключаемые бэкенд-транспорты,
    и может в конечном итоге упасть AndroidAsync там. Приоритет запроса
    и управление отменой отлично (если вы используете сеть)

  • Android-Universal-Image-Loader - самый популярный там
    в настоящий момент. Настраиваемый.

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

предстоящие изменения в новой версии UIL (1.9.2):

возможность звонить ImageLoader из пользовательского интерфейса threadNew дисковый кэш API-интерфейс (более гибкий.) Новый LruDiscCache по мотивам Джейка Уортона Дисклрукаче.

учитывая все это Android-Universal-Image-Loader suites ваше требование (загрузка изображений на локальный диск)!

Я хотел бы поделиться своим опытом с этими 3 библиотеками: UIL, Picasso и Volley. Я ранее использовал UIL, но потом пришел к выводу, что я не могу его рекомендовать, и я бы предложил использовать Volley или Picasso вместо этого, которые разрабатываются очень талантливыми командами. UIL совсем не плох, но ему не хватает внимания к деталям двух других библиотек.

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

кроме того, мне не понравилась система дискового кэша UIL. Хотя вы можете выбирать между различными реализациями, мне нужно указать, что на данный момент нет способа ограничить дисковый кэш UIL и по общему размеру и по времени истечения срока действия объекта. Залп и Пикассо делают это, и они используют время истечения, возвращенное сервер по умолчанию, в то время как UIL игнорирует его.

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

подводя итог: Picasso имеет лучший API, но он использует глобальный http-дисковый кэш, общий для всех HttpURLConnection экземпляры, которые могут быть слишком строгими в некоторых случаях. Volley имеет лучшую производительность и модульность, но менее удобен для пользователя и потребует, чтобы вы написали свой собственный модуль или два, чтобы он работал так, как вы хотите. В целом я бы рекомендовал их обоих против ИЮОЖ.

Edit (Dec 18 2014): все изменилось с тех пор, как я написал этот первоначальный ответ, и я чувствовал, что его необходимо улучшить:

Picasso 2.4 еще более настраивается, чем более старые версии, и при использовании с OkHttp (что настоятельно рекомендуется) он также может использовать отдельный дисковый кэш для каждого экземпляра, поэтому на самом деле нет никаких ограничений в том, что вы можете сделать. Что еще более важно, я заметил, что производительность Пикассо и OkHttp улучшилось много и на мой взгляд, это теперь самое быстрое решение для загрузки изображений для Android, период. Обратите внимание, что в моем коде я всегда использую .fit() в сочетании с .centerCrop() или .centerInside() чтобы уменьшить использование памяти и избежать изменения размера растрового изображения в потоке пользовательского интерфейса. Пикассо активно развивается и поддерживается, и это, безусловно, большой плюс.

волейбол не сильно изменился, но я заметил две проблемы с ним в то же время:

  • иногда под большой нагрузкой, некоторые образы больше не загружается из-за повреждения дискового кэша.
  • миниатюры, отображаемые в NetworkImageView (с его типом масштаба, установленным в centerCrop), довольно размыты по сравнению с тем, что вы получаете с другими библиотеками.

по этим причинам я решил прекратить использовать залпом.

UIL все еще медленный (особенно дисковый кэш), и его API имеет тенденцию меняться довольно часто.

Я также протестировал новую библиотеку под названием скольжение 3 который утверждает, что он более оптимизирован, чем Пикассо с Пикассо-подобным API. По моему личному опыту это на самом деле медленнее, чем Пикассо и залп во время сетевых запросов при большой нагрузке, даже при использовании в сочетании с OkHttp. Хуже того, это вызвало несколько сбоев с моими приложениями под Lollipop при выходе из активности. Он по-прежнему имеет 2 преимущества перед своими конкурентами:

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

вывод: теперь я рекомендую использовать Picasso + OkHttp, потому что он обеспечивает лучшую гибкость, API, производительность и стабильность в сочетании. Если вам нужна поддержка GIF, вы также можете рассмотреть Glide.

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

UIL очень хорошо настраивается. Это настолько настраиваемый, что новичок может легко сделать что-то не так. Однако UIL был медленным в моем приложении, и он стал немного медленнее. Мой вариант использования был ListView с изображениями.

вчера я искал альтернатива UIL, и я обнаружил Пикассо. Пикассо было легко интегрировать и использовать: просто Picasso.context(context).load(url).into(imageview) и изображение смогло быть более быстро и ровно было интегрировано.

для меня Пикассо, безусловно, API для использования. Мой опыт с Уилом был не очень хорош.

Я думаю, что ImageLoader является более настраиваемым и гибким по сравнению с библиотекой Пикассо.