Picasso е библиотека за зареждане на изображения в Android приложения, разработена от компанията Square. Библиотеката предоставя прост и изразителен API за зареждане, кеширане и показване на графика от мрежата. Според GitHub статистиката на Picasso, библиотеката е изтеглена повече от 100 000 пъти. Picasso автоматично управлява паметта и кешира изображения на няколко нива.
Основни точки
Picasso е библиотека за асинхронно зареждане на изображения в Android, създадена от компанията Square. Името ѝ идва от художника Пабло Пикасо, отразявайки философията на библиотеката: да превръща сложна задача в прост и елегантен API. Това е най-популярната библиотека за зареждане на изображения в Android общността.
Архитектурата на Picasso е минималистична: библиотеката използва пул от нишки за зареждане, LruCache за кеш в паметта и DiskLruCache за кеш на диска. За разлика от Glide, Picasso не изисква конфигуриране на AppGlideModule и е готов за използване веднага след добавяне на зависимостта. Това го прави идеален избор за прототипи и малки проекти.
Picasso 2.8 — последната стабилна версия, съвместима с Android API 21+ и Java 8+. Библиотеката не изисква конфигурация на Gradle плъгини или анотации, което опростява миграцията между версиите и намалява риска от грешки при обновяване. Въпреки дългата си история, Picasso остава търсен в хиляди проекти по целия свят.
Основната задача на Picasso е да зареди изображение от URL, да го декодира, да промени размера му ако е необходимо и да го покаже в ImageView. Библиотеката автоматично управлява фоновите нишки, кеша и повторното използване на ImageView в списъци.
От пускането си през 2013 г., Picasso се превърна в стандарт за зареждане на изображения в Android общността. Библиотеката се използва в хиляди приложения благодарение на минималния праг за навлизане — за първото използване е достатъчен един ред код.
Приоритетите в Picasso позволяват управление на реда за зареждане на изображения. По подразбиране всички заявки имат нормален приоритет, но за критични изображения може да се зададе висок приоритет чрез метода priority. Ако ImageView се използва повторно (например в RecyclerView), Picasso автоматично отменя предишната заявка и стартира нова, предотвратявайки мигане на изображения при скролване.
Picasso предлага набор от функции, които покриват основните сценарии за работа с изображения в мобилни приложения без излишна сложност.
Кешът на Picasso се състои от две нива: оперативна памет за бърз достъп и диск за постоянно съхранение. При заявка за изображение библиотеката първо проверява кеша в паметта, след това диска и едва тогава изпълнява мрежова заявка. Това значително ускорява показването на многократно зареждани изображения.
Трансформациите позволяват промяна на размера, изрязване или завъртане на изображението без декодиране на оригинала всеки път. Picasso предоставя вградени трансформации CenterCrop и CenterInside, както и възможност за създаване на персонализирани трансформации чрез интерфейса Transformation. Трансформираните изображения се кешират отделно.
Placeholder се показва по време на зареждане на изображението от мрежата, давайки на потребителя визуална обратна връзка. Изображението за грешка се показва при неуспешно зареждане. Picasso също поддържа изображение, което се показва докато не бъде заредена нова версия, което е полезно за актуализируеми аватари.
Picasso поддържа зареждане на изображения от URL, ресурси, файлове, доставчици на съдържание и URI. Методът load() е претоварен за всички тези типове и библиотеката автоматично определя източника. За ресурси и файлове Picasso не изпълнява мрежова заявка, а зарежда данните директно, което ускорява показването на вградена графика.
Picasso използва архитектура, базирана на RequestCreator и Dispatcher. Всяка заявка се създава чрез Picasso.get().load() и се изпълнява в пул от нишки. Dispatcher управлява опашката от заявки, приоритетите и отмяната на заявки при повторно използване на ImageView.
При извикване на into(view), Picasso създава обект Action, който съдържа URL, трансформации, target и callback. Action се поставя в опашката на Dispatcher. Двигателят зарежда изображението чрез Downloader (по подразбиране OkHttp), декодира Bitmap, прилага трансформациите и връща резултата в UI нишката. Всички изображения автоматично се нагаждат към размера на ImageView.
Picasso.get()
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.resize(400, 300)
.centerCrop()
.into(imageView)
Инсталирането на Picasso се извършва чрез Gradle. Библиотеката се разпространява чрез Maven Central и не изисква сложна конфигурация. Минималната версия на Android API е 21.
Във файла build.gradle на ниво модул добавете implementation 'com.squareup.picasso:picasso:2.8'. След синхронизация на Gradle, Picasso е готов за използване. За работа с мрежата Picasso автоматично използва OkHttp, ако присъства в проекта, или вградения HttpURLConnection.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka за зареждане от OkHttp (по избор)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
Индикаторът за отстраняване на грешки на Picasso показва цветен триъгълник в ъгъла на всяко изображение: червен за мрежово зареждане, син за кеш на диска, зелен за кеш в паметта. Включва се чрез извикване на setIndicatorsEnabled(true) на инстанцията на Picasso. Кешът по подразбиране е 15% от наличната памет на устройството.
За конфигуриране на персонализирана инстанция на Picasso използвайте Picasso.Builder. Той позволява задаване на Executor за фонови нишки, Downloader за мрежови заявки, MemoryCache и DiskCache. Персонализираната инстанция е особено полезна в тестове, където Downloader може да бъде заменен със заглушка, която връща изображение без мрежова заявка.
Примерите по-долу показват типични сценарии за работа с Picasso: зареждане на просто изображение, използване на трансформации и зареждане в RecyclerView.
Основното зареждане в ImageView се извършва с едно извикване. Picasso автоматично нагажда изображението към размерите на изгледа, като взема предвид scaleType. Placeholder се показва до завършване на зареждането, а error — при грешка във връзката.
Picasso.get()
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.broken_image)
.fit()
.centerCrop()
.into(imageView)
Трансформацията BlurTransformation размазва изображението с определен радиус. Персонализираните трансформации имплементират интерфейса Transformation с метода transform. Кешът запазва резултата от трансформацията под уникален ключ, за да не я прилага отново.
public class BlurTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
Bitmap blurred = Bitmap.createBitmap(source);
RenderScript rs = RenderScript.create(context);
// прилагане на размазване
source.recycle();
return blurred;
}
@Override
public String key() {
return "blur";
}
}
В RecyclerView Picasso автоматично отменя заявки за ImageView, които са излезли от екрана, и повторно използва вече заредени изображения. Това предотвратява изтичане на памет и осигурява плавно скролване.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
Сравнението на Picasso и Glide е често срещан въпрос при избора на библиотека за зареждане на изображения в Android. И двете библиотеки решават една и съща задача, но имат различни приоритети и характеристики на използване.
Picasso е по-подходящ за проекти, където простотата и минималният размер на APK са важни. Glide се избира, когато е необходима поддръжка за GIF, видео кадри и максимална оптимизация на паметта. Glide автоматично мащабира изображението до точния размер на ImageView, което намалява консумацията на памет до 50% в сравнение с Picasso в някои сценарии.
Според тестове за производителност, Glide показва по-добри резултати при работа с RecyclerView благодарение на механизма за предварително зареждане и автоматично отменяне на заявки при бързо скролване. Picasso използва по-проста стратегия, което го прави предсказуем, но по-малко ефективен при големи обеми данни.
Picasso се фокусира върху простотата на API и минималния размер. Glide предлага по-широка функционалност: поддръжка за GIF, анимирани изображения, видео кадри и интеграция с жизнения цикъл. Glide също управлява паметта по-ефективно благодарение на автоматичното мащабиране до размера на ImageView.
| Критерий | Picasso | Glide |
|---|---|---|
| Размер на библиотеката | ~120 KB | ~500 KB |
| Поддръжка на GIF | Не | Да |
| Видео кадри | Не | Да |
| Разработчик | Square | Google (Bumptech) |
| API | Fluent верига | RequestBuilder |
Според Android Developer Relations, Glide се препоръчва от Google като предпочитана библиотека за зареждане на изображения в нови проекти. Picasso остава отличен избор за прости проекти, където не са необходими GIF и видео кадри.
Често задавани въпроси
Picasso е по-малък и по-лесен за използване. Glide поддържа GIF и видео кадри, управлява паметта по-ефективно и се препоръчва от Google. Изборът зависи от нуждите на проекта за допълнителни формати.
За изчистване на кеша на Picasso използвайте метода Picasso.get().invalidate(url) за едно изображение или shutdown() за пълно изчистване. Дисковият кеш се изтрива при преинсталиране на приложението или чрез системни настройки.
Picasso не зависи от завъртането на екрана. Заредените изображения се съхраняват в кеша и се показват от него при повторно създаване на Activity. За ускоряване използвайте ViewModel заедно с Picasso за съхраняване на заредените данни.
Да, Picasso е напълно съвместим с Kotlin. Kotlin разработчиците могат да използват разширяващи функции за по-кратък синтаксис или да приложат библиотеката koptional за обработка на null стойности при зареждане на изображения.
Picasso използва LruCache за кеш в паметта, автоматично изчиствайки неизползвани изображения. Размерът на кеша по подразбиране е 15% от наличната памет на приложението. При недостиг на памет, Picasso освобождава ресурси чрез onTrimMemory.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също