Picasso هي مكتبة لتحميل الصور في تطبيقات Android، طورتها شركة Square. توفر المكتبة واجهة برمجة تطبيقات بسيطة ومعبرة لتحميل الصور وتخزينها مؤقتاً وعرضها من الشبكة. وفقاً إحصائيات Picasso على GitHub، تم تنزيل المكتبة أكثر من 100,000 مرة. تدير Picasso الذاكرة تلقائياً وتخزن الصور مؤقتاً على مستويات متعددة.
الملخص
Picasso هي مكتبة للتحميل غير المتزامن للصور في Android، أنشأتها Square. سُميت تيمناً بالفنان بابلو بيكاسو، مما يعكس فلسفة المكتبة: تحويل المهمة المعقدة إلى واجهة برمجة تطبيقات بسيطة وأنيقة. إنها المكتبة الأكثر شعبية لتحميل الصور في مجتمع 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 يتكون من مستويين: RAM للوصول السريع والقرص للتخزين الدائم. عند طلب صورة، تتحقق المكتبة أولاً من الذاكرة المؤقتة، ثم القرص، وبعدها فقط تقوم بطلب شبكي. هذا يسرع بشكل كبير عرض الصور التي يتم تحميلها بشكل متكرر.
التحويلات تتيح تغيير حجم الصورة أو قصها أو تدويرها دون فك تشفير الأصل في كل مرة. توفر Picasso تحويلات مدمجة CenterCrop وCenterInside، وتتيح أيضاً إنشاء تحويلات مخصصة عبر واجهة Transformation. يتم تخزين الصور المحولة مؤقتاً بشكل منفصل.
الصورة البديلة تُعرض أثناء تحميل الصورة من الشبكة، مما يعطي المستخدم ردود فعل بصرية. تُعرض صورة الخطأ عند فشل التحميل. تدعم Picasso أيضاً صورة تُعرض حتى يتم تحميل إصدار جديد، وهو مفيد للصور الرمزية القابلة للتحديث.
Picasso تدعم تحميل الصور من URL والموارد والملفات وموفري المحتوى وURI. طريقة load() محملة بشكل زائد لجميع هذه الأنواع، وتحدد المكتبة المصدر تلقائياً. بالنسبة للموارد والملفات، لا تقوم Picasso بطلب شبكي بل تحمل البيانات مباشرة، مما يسرع عرض الرسومات المدمجة.
Picasso تستخدم بنية تعتمد على RequestCreator وDispatcher. يتم إنشاء كل طلب عبر Picasso.get().load() وتنفيذه في مجموعة خيوط. يدير Dispatcher قائمة انتظار الطلبات والأولويات والإلغاء عند إعادة استخدام ImageView.
عند استدعاء into(view)، تنشئ Picasso كائن Action يحتوي على URL والتحويلات والهدف والاستدعاء. يتم وضع Action في قائمة انتظار Dispatcher. يقوم المحرك بتحميل الصورة عبر Downloader (OkHttp افتراضياً)، وفك تشفير Bitmap، وتطبيق التحويلات، وتسليم النتيجة إلى خيط واجهة المستخدم. جميع الصور تُضبط تلقائياً لحجم 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 بـ stub يعيد صورة بدون طلب شبكي.
الأمثلة أدناه توضح السيناريوهات النموذجية للعمل مع Picasso: تحميل صورة بسيطة، استخدام التحويلات، والتحميل في RecyclerView.
التحميل الأساسي في ImageView يتم باستدعاء واحد. Picasso تضبط الصورة تلقائياً لأبعاد العرض مع مراعاة scaleType. تُعرض الصورة البديلة حتى اكتمال التحميل، وتُعرض صورة الخطأ عند حدوث خطأ في الاتصال.
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 تلقائياً طلبات ImageViews التي خرجت من الشاشة وتعيد استخدام الصور المحملة بالفعل. هذا يمنع تسرب الذاكرة ويضمن تمريراً سلساً.
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 يقدم وظائف أوسع: دعم GIFs والصور المتحركة وإطارات الفيديو والتكامل مع دورة الحياة. Glide أيضاً يدير الذاكرة بكفاءة أكبر بفضل الضبط التلقائي لحجم ImageView.
| المعيار | Picasso | Glide |
|---|---|---|
| حجم المكتبة | ~120 كيلوبايت | ~500 كيلوبايت |
| دعم GIF | لا | نعم |
| إطارات الفيديو | لا | نعم |
| المطور | Square | Google (Bumptech) |
| API | سلسلة fluent | RequestBuilder |
وفقاً لعلاقات مطوري Android، يُوصي Google بـ Glide كمكتبة مفضلة لتحميل الصور في المشاريع الجديدة. تبقى Picasso خياراً ممتازاً للمشاريع البسيطة حيث لا تكون هناك حاجة لـ GIFs وإطارات الفيديو.
الأسئلة الشائعة
Picasso أصغر حجماً وأسهل في الاستخدام. Glide يدعم GIFs وإطارات الفيديو ويدير الذاكرة بكفاءة أكبر ويوصي به Google. يعتمد الاختيار على حاجة المشروع لتنسيقات إضافية.
لـ مسح ذاكرة Picasso المؤقتة، استخدم طريقة Picasso.get().invalidate(url) لصورة واحدة أو shutdown() للمسح الكامل. تُحذف الذاكرة المؤقتة على القرص عند إعادة تثبيت التطبيق أو من خلال إعدادات النظام.
Picasso لا تعتمد على تدوير الشاشة. تُخزّن الصور المحملة في الذاكرة المؤقتة وتُعرض منها عند إعادة إنشاء Activity. للتسريع، استخدم ViewModel مع Picasso للحفاظ على البيانات المحملة.
نعم، Picasso متوافقة تماماً مع Kotlin. يمكن لمطوري Kotlin استخدام دوال التمديد لبناء جملة أكثر إيجازاً أو تطبيق مكتبة koptional للتعامل مع القيم الفارغة عند تحميل الصور.
Picasso تستخدم LruCache للذاكرة المؤقتة، وتنظف الصور غير المستخدمة تلقائياً. حجم الذاكرة المؤقتة الافتراضي هو 15% من الذاكرة المتاحة للتطبيق. عند انخفاض الذاكرة، تحرر Picasso الموارد عبر onTrimMemory.
الملخص النهائي
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.