Picasso: ما هي، تحميل الصور والعمل في تطبيقات Android

المؤلف: IT Sectr نُشر: 2026-05-05 وقت القراءة: 8 دق

Picasso هي مكتبة لتحميل الصور في تطبيقات Android، طورتها شركة Square. توفر المكتبة واجهة برمجة تطبيقات بسيطة ومعبرة لتحميل الصور وتخزينها مؤقتاً وعرضها من الشبكة. وفقاً إحصائيات Picasso على GitHub، تم تنزيل المكتبة أكثر من 100,000 مرة. تدير Picasso الذاكرة تلقائياً وتخزن الصور مؤقتاً على مستويات متعددة.

الملخص

  • Picasso - مكتبة تحميل صور من Square بواجهة برمجة تطبيقات بسيطة لنظام Android
  • التخزين المؤقت على القرص وفي الذاكرة يقلل وقت تحميل الصور المتكررة
  • التحويلات Crop وResize وRotate تُطبق على الصور أثناء التنقل
  • الصورة البديلة وصورة الخطأ تُعرضان أثناء التحميل وعند حدوث خطأ
  • أولويات التحميل تتيح التحكم في ترتيب عرض الصور

ما هي 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 تقدم مجموعة من الميزات التي تغطي السيناريوهات الرئيسية للتعامل مع الصور في تطبيقات الهاتف المحمول دون تعقيد غير ضروري.

التخزين المؤقت متعدد المستويات

التخزين المؤقت في Picasso يتكون من مستويين: RAM للوصول السريع والقرص للتخزين الدائم. عند طلب صورة، تتحقق المكتبة أولاً من الذاكرة المؤقتة، ثم القرص، وبعدها فقط تقوم بطلب شبكي. هذا يسرع بشكل كبير عرض الصور التي يتم تحميلها بشكل متكرر.

تحويلات الصور

التحويلات تتيح تغيير حجم الصورة أو قصها أو تدويرها دون فك تشفير الأصل في كل مرة. توفر Picasso تحويلات مدمجة CenterCrop وCenterInside، وتتيح أيضاً إنشاء تحويلات مخصصة عبر واجهة Transformation. يتم تخزين الصور المحولة مؤقتاً بشكل منفصل.

الصورة البديلة وصورة الخطأ

الصورة البديلة تُعرض أثناء تحميل الصورة من الشبكة، مما يعطي المستخدم ردود فعل بصرية. تُعرض صورة الخطأ عند فشل التحميل. تدعم Picasso أيضاً صورة تُعرض حتى يتم تحميل إصدار جديد، وهو مفيد للصور الرمزية القابلة للتحديث.

التحميل من مصادر مختلفة

Picasso تدعم تحميل الصور من URL والموارد والملفات وموفري المحتوى وURI. طريقة load() محملة بشكل زائد لجميع هذه الأنواع، وتحدد المكتبة المصدر تلقائياً. بالنسبة للموارد والملفات، لا تقوم Picasso بطلب شبكي بل تحمل البيانات مباشرة، مما يسرع عرض الرسومات المدمجة.

كيف تعمل Picasso؟

Picasso تستخدم بنية تعتمد على RequestCreator وDispatcher. يتم إنشاء كل طلب عبر Picasso.get().load() وتنفيذه في مجموعة خيوط. يدير Dispatcher قائمة انتظار الطلبات والأولويات والإلغاء عند إعادة استخدام ImageView.

بنية الطلب

عند استدعاء into(view)، تنشئ Picasso كائن Action يحتوي على URL والتحويلات والهدف والاستدعاء. يتم وضع Action في قائمة انتظار Dispatcher. يقوم المحرك بتحميل الصورة عبر Downloader (OkHttp افتراضياً)، وفك تشفير Bitmap، وتطبيق التحويلات، وتسليم النتيجة إلى خيط واجهة المستخدم. جميع الصور تُضبط تلقائياً لحجم ImageView.

java
Picasso.get()
    .load("https://example.com/image.jpg")
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(400, 300)
    .centerCrop()
    .into(imageView)

تثبيت وتهيئة Picasso

تثبيت Picasso يتم عبر Gradle. تُوزع المكتبة عبر Maven Central ولا تتطلب تهيئة معقدة. الحد الأدنى لإصدار Android API هو 21.

إضافة التبعية

في ملف build.gradle على مستوى الوحدة، أضف implementation ‘com.squareup.picasso:picasso:2.8’. بعد مزامنة Gradle، تكون Picasso جاهزة للاستخدام. لعمليات الشبكة، تستخدم Picasso تلقائياً OkHttp إذا كان موجوداً في المشروع، أو HttpURLConnection المدمج.

groovy
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

الأمثلة أدناه توضح السيناريوهات النموذجية للعمل مع Picasso: تحميل صورة بسيطة، استخدام التحويلات، والتحميل في RecyclerView.

تحميل صورة في ImageView

التحميل الأساسي في ImageView يتم باستدعاء واحد. Picasso تضبط الصورة تلقائياً لأبعاد العرض مع مراعاة scaleType. تُعرض الصورة البديلة حتى اكتمال التحميل، وتُعرض صورة الخطأ عند حدوث خطأ في الاتصال.

java
Picasso.get()
    .load("https://example.com/photo.jpg")
    .placeholder(R.drawable.loading)
    .error(R.drawable.broken_image)
    .fit()
    .centerCrop()
    .into(imageView)

تطبيق تحويل مخصص

BlurTransformation تُضبب الصورة بنصف قطر محدد. التحويلات المخصصة تنفذ واجهة Transformation بطريقة transform. تخزن الذاكرة المؤقتة نتيجة التحويل تحت مفتاح فريد لتجنب إعادة تطبيقه.

java
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

في RecyclerView، تلغي Picasso تلقائياً طلبات ImageViews التي خرجت من الشاشة وتعيد استخدام الصور المحملة بالفعل. هذا يمنع تسرب الذاكرة ويضمن تمريراً سلساً.

java
public void onBindViewHolder(ViewHolder holder, int position) {
    String url = items.get(position).getImageUrl();
    Picasso.get()
        .load(url)
        .fit()
        .centerCrop()
        .into(holder.imageView);
}

Picasso مقابل Glide: مقارنة المكتبات

مقارنة Picasso وGlide هي سؤال شائع عند اختيار مكتبة تحميل الصور لنظام Android. كلتا المكتبتين تحلان نفس المهمة لكن لهما أولويات وخصائص استخدام مختلفة.

Picasso مناسبة أكثر للمشاريع حيث البساطة وحجم APK الأدنى مهمان. يتم اختيار Glide عندما تكون هناك حاجة لدعم GIF وإطارات الفيديو والتحسين الأقصى للذاكرة. Glide يضبط الصورة تلقائياً للحجم الدقيق لـ ImageView، مما يقلل استهلاك الذاكرة بنسبة تصل إلى 50% مقارنة بـ Picasso في بعض السيناريوهات.

في اختبارات الأداء، يُظهر Glide نتائج أفضل عند العمل مع RecyclerView بفضل آلية التحميل المسبق والإلغاء التلقائي للطلبات أثناء التمرير السريع. تستخدم Picasso استراتيجية أبسط، مما يجعلها قابلة للتنبؤ ولكن أقل كفاءة على كميات البيانات الكبيرة.

Picasso تركز على بساطة API والحجم الأدنى. Glide يقدم وظائف أوسع: دعم GIFs والصور المتحركة وإطارات الفيديو والتكامل مع دورة الحياة. Glide أيضاً يدير الذاكرة بكفاءة أكبر بفضل الضبط التلقائي لحجم ImageView.

المعيارPicassoGlide
حجم المكتبة~120 كيلوبايت~500 كيلوبايت
دعم GIFلانعم
إطارات الفيديولانعم
المطورSquareGoogle (Bumptech)
APIسلسلة fluentRequestBuilder

وفقاً لعلاقات مطوري Android، يُوصي Google بـ Glide كمكتبة مفضلة لتحميل الصور في المشاريع الجديدة. تبقى Picasso خياراً ممتازاً للمشاريع البسيطة حيث لا تكون هناك حاجة لـ GIFs وإطارات الفيديو.

الأسئلة الشائعة

ما الفرق بين Picasso وGlide؟

Picasso أصغر حجماً وأسهل في الاستخدام. Glide يدعم GIFs وإطارات الفيديو ويدير الذاكرة بكفاءة أكبر ويوصي به Google. يعتمد الاختيار على حاجة المشروع لتنسيقات إضافية.

كيفية مسح ذاكرة Picasso المؤقتة؟

لـ مسح ذاكرة Picasso المؤقتة، استخدم طريقة Picasso.get().invalidate(url) لصورة واحدة أو shutdown() للمسح الكامل. تُحذف الذاكرة المؤقتة على القرص عند إعادة تثبيت التطبيق أو من خلال إعدادات النظام.

كيف تتعامل Picasso مع تدوير الشاشة؟

Picasso لا تعتمد على تدوير الشاشة. تُخزّن الصور المحملة في الذاكرة المؤقتة وتُعرض منها عند إعادة إنشاء Activity. للتسريع، استخدم ViewModel مع Picasso للحفاظ على البيانات المحملة.

هل يمكن استخدام Picasso مع Kotlin؟

نعم، Picasso متوافقة تماماً مع Kotlin. يمكن لمطوري Kotlin استخدام دوال التمديد لبناء جملة أكثر إيجازاً أو تطبيق مكتبة koptional للتعامل مع القيم الفارغة عند تحميل الصور.

كيف تدير Picasso الذاكرة؟

Picasso تستخدم LruCache للذاكرة المؤقتة، وتنظف الصور غير المستخدمة تلقائياً. حجم الذاكرة المؤقتة الافتراضي هو 15% من الذاكرة المتاحة للتطبيق. عند انخفاض الذاكرة، تحرر Picasso الموارد عبر onTrimMemory.

الملخص النهائي

  • Picasso - مكتبة خفيفة لتحميل الصور من Square بواجهة API بسيطة
  • التخزين المؤقت على القرص وفي الذاكرة مع إدارة تلقائية للحجم
  • التحويلات CenterCrop وCenterInside والمخصصة عبر واجهة Transformation
  • الصورة البديلة وصورة الخطأ لتجربة مستخدم سلسة
  • الإلغاء التلقائي للطلبات في RecyclerView يمنع التحميل غير الضروري
  • مؤشر التصحيح يساعد في تحديد مصدر الصورة بصرياً
  • حجم المكتبة 120 كيلوبايت فقط - تأثير ضئيل على حجم APK

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا