پیکاسو کتابخانهای برای بارگذاری تصاویر در برنامههای اندروید است که توسط شرکت Square توسعه یافته است. این کتابخانه API ساده و گویا برای بارگذاری، کش کردن و نمایش گرافیک از شبکه فراهم میکند. بر اساس آمار گیتهاب پیکاسو، این کتابخانه بیش از 100,000 بار دانلود شده است. پیکاسو به صورت خودکار حافظه را مدیریت کرده و تصاویر را در چند سطح کش میکند.
نکات اصلی
پیکاسو کتابخانهای برای بارگذاری ناهمگام تصاویر در اندروید است که توسط شرکت Square ساخته شده است. نام خود را از هنرمند پابلو پیکاسو گرفته که فلسفه کتابخانه را منعکس میکند: تبدیل یک کار پیچیده به یک API ساده و زیبا. این محبوبترین کتابخانه برای بارگذاری تصاویر در جامعه اندروید است.
معماری پیکاسو مینیمالیستی است: کتابخانه از یک استخر نخ برای بارگذاری، LruCache برای کش در حافظه و DiskLruCache برای کش دیسک استفاده میکند. برخلاف گلاید، پیکاسو نیازی به تنظیم AppGlideModule ندارد و بلافاصله پس از افزودن وابستگی آماده استفاده است. این使它 را به گزینهای ایدهآل برای نمونههای اولیه و پروژههای کوچک تبدیل میکند.
پیکاسو 2.8 — آخرین نسخه پایدار، سازگار با Android API 21+ و Java 8+. کتابخانه به تنظیمات پلاگینهای Gradle یا حاشیهنویسی نیاز ندارد که مهاجرت بین نسخهها را ساده کرده و خطر خطاها را در هنگام بهروزرسانی کاهش میدهد. با وجود تاریخچه طولانی، پیکاسو همچنان در هزاران پروژه در سراسر جهان مورد استفاده قرار میگیرد.
وظیفه اصلی پیکاسو بارگذاری تصویر از URL، رمزگشایی آن، تغییر اندازه در صورت نیاز و نمایش در ImageView است. کتابخانه به طور خودکار نخهای پسزمینه، کش و استفاده مجدد از ImageView در لیستها را مدیریت میکند.
از زمان انتشار در سال 2013، پیکاسو به استانداردی برای بارگذاری تصاویر در جامعه اندروید تبدیل شده است. این کتابخانه در هزاران برنامه به دلیل حداقل آستانه ورود استفاده میشود — برای اولین استفاده تنها یک خط کد کافی است.
اولویتها در پیکاسو امکان مدیریت ترتیب بارگذاری تصاویر را فراهم میکنند. به طور پیشفرض همه درخواستها اولویت عادی دارند، اما برای تصاویر حیاتی میتوان اولویت بالا را از طریق متد priority تنظیم کرد. اگر ImageView دوباره استفاده شود (مثلاً در RecyclerView)، پیکاسو به طور خودکار درخواست قبلی را لغو کرده و درخواست جدیدی را شروع میکند و از سوسو زدن تصاویر در هنگام اسکرول جلوگیری میکند.
پیکاسو مجموعهای از ویژگیها را ارائه میدهد که سناریوهای اصلی کار با تصاویر در برنامههای موبایل را بدون پیچیدگی غیرضروری پوشش میدهد.
کش پیکاسو از دو سطح تشکیل شده است: حافظه رم برای دسترسی سریع و دیسک برای ذخیره دائمی. هنگام درخواست تصویر، کتابخانه ابتدا کش حافظه، سپس دیسک و فقط پس از آن درخواست شبکه را بررسی میکند. این کار نمایش تصاویر بارگذاری شده مکرر را به طور قابل توجهی سرعت میبخشد.
تبدیلها امکان تغییر اندازه، برش یا چرخش تصویر را بدون رمزگشایی مجدد اصل هر بار فراهم میکنند. پیکاسو تبدیلهای داخلی CenterCrop و CenterInside را ارائه میدهد و همچنین امکان ایجاد تبدیلهای سفارشی را از طریق رابط Transformation فراهم میکند. تصاویر تبدیل شده به طور جداگانه کش میشوند.
Placeholder در هنگام بارگذاری تصویر از شبکه نمایش داده میشود و به کاربر بازخورد بصری میدهد. تصویر خطا در هنگام شکست بارگذاری نشان داده میشود. پیکاسو همچنین تصویری را پشتیبانی میکند که تا زمانی که نسخه جدید بارگذاری نشده نمایش داده میشود، که برای آواتارهای قابل بهروزرسانی مفید است.
پیکاسو از بارگذاری تصاویر از URL، منابع، فایلها، ارائهدهندگان محتوا و URI پشتیبانی میکند. متد load() برای همه این انواع بارگذاری شده است و کتابخانه به طور خودکار منبع را تشخیص میدهد. برای منابع و فایلها، پیکاسو درخواست شبکه انجام نمیدهد و دادهها را مستقیماً بارگذاری میکند که نمایش گرافیک داخلی را سرعت میبخشد.
پیکاسو از معماری مبتنی بر RequestCreator و Dispatcher استفاده میکند. هر درخواست از طریق Picasso.get().load() ایجاد شده و در یک استخر نخ اجرا میشود. Dispatcher صف درخواستها، اولویتها و لغو درخواستها را در هنگام استفاده مجدد از ImageView مدیریت میکند.
هنگام فراخوانی into(view)، پیکاسو یک شی 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)
نصب پیکاسو از طریق Gradle انجام میشود. کتابخانه از طریق Maven Central منتشر میشود و نیازی به تنظیمات پیچیده ندارد. حداقل نسخه Android API 21 است.
در فایل build.gradle سطح ماژول، implementation 'com.squareup.picasso:picasso:2.8' را اضافه کنید. پس از همگامسازی Gradle، پیکاسو آماده استفاده است. برای کار با شبکه، پیکاسو به طور خودکار از OkHttp در صورت وجود در پروژه، یا HttpURLConnection داخلی استفاده میکند.
dependencies {
implementation "com.squareup.picasso:picasso:2.8"
}
// Kafka برای بارگذاری از OkHttp (اختیاری)
implementation "com.squareup.okhttp3:okhttp:4.12.0"
نشانگر اشکالزدایی پیکاسو یک مثلث رنگی در گوشه هر تصویر نشان میدهد: قرمز برای بارگذاری شبکه، آبی برای کش دیسک، سبز برای کش حافظه. با فراخوانی setIndicatorsEnabled(true) روی نمونه پیکاسو فعال میشود. کش پیشفرض 15% از حافظه قابل دسترس دستگاه است.
برای تنظیم یک نمونه سفارشی پیکاسو از Picasso.Builder استفاده کنید. این امکان تنظیم Executor برای نخهای پسزمینه، Downloader برای درخواستهای شبکه، MemoryCache و DiskCache را فراهم میکند. نمونه سفارشی به ویژه در آزمایشها مفید است، جایی که میتوان Downloader را با یک stub جایگزین کرد که تصویر را بدون درخواست شبکه برمیگرداند.
نمونههای زیر سناریوهای معمول کار با پیکاسو را نشان میدهند: بارگذاری یک تصویر ساده، استفاده از تبدیلها و بارگذاری در RecyclerView.
بارگذاری پایه در ImageView با یک فراخوانی انجام میشود. پیکاسو به طور خودکار تصویر را با توجه به scaleType با ابعاد view تطبیق میدهد. 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، پیکاسو به طور خودکار درخواستها را برای ImageViewهایی که از صفحه خارج شدهاند لغو میکند و از تصاویر بارگذاری شده قبلی استفاده مجدد میکند. این کار از نشت حافظه جلوگیری کرده و اسکرول روان را تضمین میکند.
public void onBindViewHolder(ViewHolder holder, int position) {
String url = items.get(position).getImageUrl();
Picasso.get()
.load(url)
.fit()
.centerCrop()
.into(holder.imageView);
}
مقایسه پیکاسو و گلاید یک سوال رایج هنگام انتخاب کتابخانه بارگذاری تصاویر در اندروید است. هر دو کتابخانه یک کار را حل میکنند اما اولویتها و ویژگیهای استفاده متفاوتی دارند.
پیکاسو برای پروژههایی مناسبتر است که سادگی و حداقل حجم APK مهم است. گلاید زمانی انتخاب میشود که نیاز به پشتیبانی از GIF، فریمهای ویدیویی و بهینهسازی حداکثر حافظه باشد. گلاید به طور خودکار تصویر را به اندازه دقیق ImageView مقیاس میکند که مصرف حافظه را تا 50% در مقایسه با پیکاسو در برخی سناریوها کاهش میدهد.
بر اساس آزمایشهای عملکرد، گلاید نتایج بهتری در کار با RecyclerView به دلیل مکانیزم پیشبارگذاری و لغو خودکار درخواستها در اسکرول سریع نشان میدهد. پیکاسو از استراتژی سادهتری استفاده میکند که آن را قابل پیشبینی اما در حجمهای بزرگ داده کمتر کارآمد میکند.
پیکاسو بر سادگی API و حداقل حجم تمرکز دارد. گلاید عملکرد وسیعتری ارائه میدهد: پشتیبانی از GIF، تصاویر متحرک، فریمهای ویدیویی و یکپارچهسازی با چرخه حیات. گلاید همچنین به دلیل مقیاسبندی خودکار به اندازه ImageView حافظه را کارآمدتر مدیریت میکند.
| معیار | پیکاسو | گلاید |
|---|---|---|
| حجم کتابخانه | ~120 KB | ~500 KB |
| پشتیبانی از GIF | خیر | بله |
| فریمهای ویدیویی | خیر | بله |
| توسعهدهنده | Square | Google (Bumptech) |
| API | زنجیره Fluent | RequestBuilder |
بر اساس اطلاعات Android Developer Relations، گلاید توسط Google به عنوان کتابخانه ترجیحی برای بارگذاری تصاویر در پروژههای جدید توصیه میشود. پیکاسو انتخاب عالی برای پروژههای سادهای باقی میماند که نیازی به GIF و فریمهای ویدیویی ندارند.
سوالات متداول
پیکاسو حجم کمتری دارد و استفاده از آن سادهتر است. گلاید از GIF و فریمهای ویدیویی پشتیبانی میکند، حافظه را کارآمدتر مدیریت میکند و توسط Google توصیه میشود. انتخاب بستگی به نیاز پروژه به فرمتهای اضافی دارد.
برای پاک کردن کش پیکاسو از متد Picasso.get().invalidate(url) برای یک تصویر یا shutdown() برای پاک کردن کامل استفاده کنید. کش دیسک با نصب مجدد برنامه یا از طریق تنظیمات سیستم پاک میشود.
پیکاسو به چرخش صفحه وابسته نیست. تصاویر بارگذاری شده در کش ذخیره شده و در هنگام بازسازی Activity از آن نمایش داده میشوند. برای سرعت بخشیدن، از ViewModel به همراه پیکاسو برای ذخیره دادههای بارگذاری شده استفاده کنید.
بله، پیکاسو کاملاً با کاتلین سازگار است. توسعهدهندگان کاتلین میتوانند از توابع توسعهدهنده برای نحو خلاصهتر استفاده کنند یا کتابخانه koptional را برای مدیریت مقادیر null در بارگذاری تصاویر به کار ببرند.
پیکاسو از LruCache برای کش در حافظه استفاده میکند و تصاویر استفاده نشده را به طور خودکار پاک میکند. اندازه پیشفرض کش 15% از حافظه قابل دسترس برنامه است. در کمبود حافظه، پیکاسو منابع را از طریق onTrimMemory آزاد میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید