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 відображається під час завантаження зображення з мережі, надаючи користувачу візуальний відгук. Error-зображення показується при збої завантаження. 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 автоматично підганяє зображення під розміри view з урахуванням 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 КБ | ~500 КБ |
| Підтримка 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 можуть використовувати extension-функції для більш лаконічного синтаксису або застосовувати бібліотеку koptional для обробки null-значень при завантаженні зображень.
Picasso використовує LruCache для кешу в пам’яті, автоматично очищаючи невикористовувані зображення. Розмір кешу за замовчуванням — 15% від доступної пам’яті додатку. При нестачі пам’яті Picasso звільняє ресурси через onTrimMemory.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також