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

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

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

5 ответов


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

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

Пикассо:

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

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

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

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

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

  • иногда вы хотите асинхронно считывать изображение в растровое изображение, возвращаемое прослушивателем. Удивительно Пикассо нет. "fetch ()" доза не передает ничего. "get () "предназначен для синхронного чтения, а" 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-Универсальный-Загрузчик Изображений - самый популярный там
    в настоящий момент. Настраиваемый.

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

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

возможность вызова ImageLoader из UI threadNew Disk Cache API (более гибкий.) Новый LruDiscCache на основе Джейка Уортона Дисклрукач.

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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