Локальное решение для кэширования изображений для Android: Square Picasso vs Universal Image Loader
Я ищу асинхронную библиотеку загрузки и кеширования изображений в Android. Я собирался использовать Picasso, но нашел, что Universal Image Loader более популярен в GitHub. Кто-нибудь знает об этих двух библиотеках? Резюме плюсов и минусов было бы здорово.
(Все мои изображения на диске локально, поэтому мне не нужна сетевая связь, поэтому я не думаю, что Volley подходит)
Ответы
Ответ 1
Сравнение Koushik Dutta в основном относится к эталону скорости. Его сообщение касалось только самых простых вещей и не относится к местным изображениям. Я хотел бы поделиться своим опытом с Пикассо и UIL после того, как задал вопрос. И Picasso, и UIL могут загружать локальные изображения. Я сначала попробовал Picasso и был счастлив, но позже я решил переключиться на UIL для получения дополнительных настроек.
Пикассо:
-
Свободный интерфейс Picasso хорош. Но, прыгая с "с", "в", "загружать", вы на самом деле не знаете, что за сценой. Это путало то, что вернулось.
-
Picasso позволяет указать точный размер цели. Это полезно, когда у вас есть проблемы с давлением или производительностью памяти, вы можете обменять некоторое качество изображения на скорость.
-
Изображения кэшируются с размером в ключе, это полезно при отображении изображений разных размеров.
-
Вы можете настроить размер кеша памяти. Но его кеш-диск предназначен только для HTTP-запросов. Для локальных изображений, если вам нужна скорость загрузки, хорошо иметь кеш мини-диска, поэтому вам не нужно считывать несколько МБ для изображения каждый раз. Picasso не имеет этого механизма для изменения размера и сохранения миниатюр на диске.
-
Picasso не предоставляет доступ к своему экземпляру кеша. (Вы можете получить его, когда вы впервые настроите Picasso и сохраните его...).
-
Иногда вы хотите асинхронно читать изображение в растровое изображение, возвращаемое слушателем. Удивительно, что у Пикассо этого нет. "fetch()" доза не пропускает ничего. "get()" для синхронного чтения, а "load()" - для асинхронного рисования представления.
-
У Picasso есть только несколько простых примеров на главной странице, и вам придется прочитать неупорядоченный javadoc для расширенного использования.
УИЛ:
-
UIL использует сборщики для настройки. Почти все можно настроить.
-
UIL не позволяет указать размер, который вы хотите загрузить в представление. Он использует некоторые правила, основанные на размере представления. Это не так гибко, как Пикассо. У меня нет возможности загружать изображение с более низким разрешением, чтобы уменьшить объем памяти. (Edit: это поведение можно легко изменить, добавив в исходный код аргумент ImageSize и обойти проверку размера представления)
-
UIL предоставляет настраиваемый кеш диска, вы можете использовать его для кэширования эскизов с указанным размером. Но это не идеально. Ниже приведены данные . (Edit: если вам нужна скорость и вы хотите, чтобы несколько уровней кэширования эскизов, как и в моем случае, вы можете изменить исходный код, позволить кешу диска использовать "memoryKey" и сделать его также чувствительным к размеру)
-
UIL по умолчанию кэширует изображения разных размеров в памяти и может быть отключен в конфигурации.
-
UIL предоставляет доступ к резервной памяти и кэш-дискам.
-
UIL предоставляет гибкие способы получения растрового изображения или загрузки в представление.
-
UIL лучше в документации. UIL дает подробные описания на странице Github, и там есть связанный учебник.
Я предлагаю начать с Picasso, если вам нужно больше контроля и настройки, перейдите на UIL.
Ответ 2
Если вы прочтете этот пост в G + by Koush, вы получите четкие решения для своих замешательств, я поставил резюме этого, в том Android-Universal-Image-Loader является победителем для вашего требования!
-
Picasso имеет самый красивый API изображений, если вы используете сеть!
-
UrlImageViewHelper + AndroidAsync является самым быстрым. Играя с этими
другие две большие библиотеки действительно подчеркнули, что API изображений
однако, весьма устарело.
-
Volley - пятно; Мне действительно нравятся их подключаемые бэкэнд-транспорты,
и может закончиться тем, что вы потеряете AndroidAsync. Приоритет запроса
и управление отменой отлично (если вы используете сеть)
-
Android-Universal-Image-Loader - самый популярный из них там
В данный момент. Высоко настраиваемый.
Этот проект направлен на предоставление многоразового инструмента для асинхронного загрузка изображений, кеширование и отображение. Первоначально он основан на Fedor Власов "и был значительно реорганизован и улучшен с тех пор Затем.
Предстоящие изменения в новой версии UIL (1.9.2):
Возможность вызова ImageLoader из интерфейса пользовательского интерфейсаNew Disk Cache API (более гибкий). Новый LruDiscCache, основанный на Jake Wharton's DiskLruCache.
Учитывая все эти комплекты Android-Universal-Image-Loader, ваше требование (загрузка изображений на локальный диск)!
Ответ 3
Я хотел бы поделиться своим опытом с этими тремя библиотеками: UIL, Picasso и Volley. Раньше я использовал UIL, но потом пришел к выводу, что не могу порекомендовать его, и я бы предложил использовать Volley или Picasso, которые были разработаны талантливыми командами. UIL совсем не плох, но ему не хватает внимания к деталям двух других библиотек.
Я обнаружил, что UIL менее приятен для производительности пользовательского интерфейса; он имеет тенденцию блокировать поток пользовательского интерфейса больше, чем Volley или Picasso. Это может быть отчасти из-за того, что UIL не поддерживает пакетную обработку ответов на изображение, в то время как Picasso и Volley делают это по умолчанию.
Кроме того, мне не нравилась система дискового кэша UIL. Хотя вы можете выбирать между различными реализациями, мне нужно указать, что на данный момент нет возможности ограничить кеш-память UIL как по общему размеру и по истечении срока действия объекта. Volley и Picasso делают это, и они используют время истечения срока действия, возвращаемое сервером по умолчанию, в то время как UIL игнорирует его.
Наконец, UIL позволяет установить глобальную конфигурацию загрузчика изображений, которая включает выбранные кэш кэша и реализации кэша кэша и настройки и другие сведения, но эта конфигурация будет применяться везде в вашем приложении. Поэтому, если вам нужна больше гибкости, например, два отдельных кэша для диска, для UIL нет необходимости. Volley, с другой стороны, позволяет вам иметь как можно больше отдельных загрузчиков изображений, каждый из которых имеет свою собственную конфигурацию. Picasso по умолчанию использует глобальный экземпляр, но также позволяет создавать отдельно настраиваемые экземпляры.
Подводя итог: Picasso имеет лучший API, но он использует глобальный кеш-диск HTTP, разделяемый всеми экземплярами HttpURLConnection
, который может быть слишком ограниченным в некоторых случаях. Волейбол имеет лучшую производительность и модульность, но менее удобен для пользователя и потребует, чтобы вы написали модуль или два из них, чтобы он работал так, как вы хотите. В целом я бы рекомендовал их против UIL.
Изменить (18 декабря 2014 г.): С момента написания этого первоначального ответа все изменилось, и я почувствовал, что это необходимо для его улучшения:
Picasso 2.4 еще более конфигурируется, чем более старые версии, и при использовании с OkHttp (что очень рекомендуется) он также может использовать отдельный кеш диска для каждого экземпляра, поэтому на самом деле нет ограничений в том, что вы можете сделать.
Что еще более важно, я заметил, что производительность Picasso и OkHttp значительно улучшилась, и, на мой взгляд, это теперь самое быстрое решение для загрузки изображений для Android. Обратите внимание, что в моем коде я всегда использую .fit()
в комбинации с .centerCrop()
или .centerInside()
, чтобы уменьшить использование памяти и избежать изменения растровых изображений в потоке пользовательского интерфейса. Пикассо активно развивается и поддерживается, и это, безусловно, большой плюс.
Волейбол не изменился так сильно, но я заметил два вопроса с ним:
- Иногда при большой нагрузке некоторые изображения больше не загружаются из-за повреждения диска.
- Эскизы, отображаемые в NetworkImageView (с типом шкалы, установленным на centerCrop), довольно размыты по сравнению с тем, что вы получаете с другими библиотеками.
По этим причинам я решил прекратить использовать Volley.
UIL все еще медленный (особенно кеш диска), и его API имеет тенденцию к изменению довольно часто.
Я также протестировал эту новую библиотеку под названием Glide 3, которая утверждает, что она более оптимизирована, чем Picasso с API, подобным Picasso. По моему личному опыту он на самом деле медленнее, чем Пикассо и Воллей во время сетевых запросов при большой нагрузке, даже если они используются в сочетании с OkHttp. Хуже того, это вызвало несколько сбоев с моими приложениями под Lollipop при выходе из активности. Он по-прежнему имеет 2 преимущества перед конкурентами:
- Он поддерживает декодирование анимированных GIF файлов
- Он помещает окончательные уменьшенные растровые изображения в кэш диска, что означает, что чтение из кеша диска происходит очень быстро.
Вывод: Теперь я рекомендую использовать Picasso + OkHttp, потому что он обеспечивает лучшую гибкость, API, производительность и стабильность в сочетании. Если вам нужна поддержка GIF, вы также можете рассмотреть Glide.
Ответ 4
Я внедрил приложение, которое должно постоянно получать и показывать изображения из Интернета. Я собирался запрограммировать механизм кэширования изображений, прежде чем друг рекомендовал мне универсальный загрузчик изображений.
UIL очень хорошо настраивается. Это так настраивается, что новичок может легко сделать что-то неправильно. Однако в моем приложении UIL был медленным, и он стал немного медленнее. Моим вариантом использования был ListView с изображениями.
Вчера я искал альтернативу UIL, и я обнаружил Пикассо. Picasso легко интегрировать и использовать: просто Picasso.context(context).load(url).into(imageview)
, и изображение может быть быстрее и плавно интегрировано.
Для меня Picasso определенно является API-интерфейсом. Мой опыт работы с UIL был неудачным.
Ответ 5
Я думаю, что ImageLoader более настраиваемый и гибкий по сравнению с библиотекой Picasso.