Glide هي مكتبة لتحميل الصور في Android، مدعومة من Google عبر مشروع Bumptech. توفر المكتبة تحميلاً فعالاً للصور ورسوم GIF المتحركة وإطارات الفيديو مع إدارة تلقائية للذاكرة. وفقاً لـ مستودع Glide على GitHub، يستخدم المشروع أكثر من 200,000 تطبيق. توصي Google باستخدام Glide كمكتبة مفضلة لتحميل الرسومات في Android.
النقاط الرئيسية
Glide هي مكتبة لتحميل سريع وفعال للصور وملفات GIF المتحركة وإطارات الفيديو في تطبيقات Android. يتم تطوير المشروع بواسطة Bumptech تحت مظلة Google ويستخدم على نطاق واسع في التطبيقات الرسمية من Google.
الهيكل الداخلي لـ Glide مبني على نهج قائم على المكونات: يدير Engine تنفيذ الطلبات، ويتولى DecodeJob فك التشفير، ويقوم ResourceDecoder بتحويل البيانات الخام إلى Bitmap أو Drawable. يمكن تخصيص كل مرحلة من خلال الوحدات والسجلات، مما يجعل Glide مكتبة مرنة للغاية لتنسيقات الصور غير القياسية.
على عكس العديد من المنافسين، صُممت Glide منذ البداية مع مراعاة خصائص Android: دورة حياة Activity و Fragment، دوران الشاشة، تغييرات التكوين. توقف المكتبة وتستأنف التحميل تلقائياً حسب حالة المكون.
وفقاً لـ Android Developers، فإن Glide هي المكتبة الموصى بها لتحميل الصور في الوثائق الرسمية من Google. تُستخدم في Google Play و Google Maps ومنتجات أخرى للشركة، مما يؤكد موثوقيتها وأداءها.
الفرق الرئيسي بين Glide والبدائل هو التحجيم التلقائي للصور لتناسب حجم ImageView. بينما يقوم Picasso بتحميل الصورة بدقة كاملة ثم يقيسها، تقوم Glide بفك تشفير الملف مباشرة بالحجم المطلوب. يقلل هذا من استهلاك الذروة للذاكرة ويسرع العرض في القوائم بأحجام خلايا مختلفة.
Glide توفر مجموعة واسعة من الوظائف للعمل مع الصور، تغطي سيناريوهات تحميل المحتوى البسيطة والمعقدة.
GIF و WebP المتحركة يتم تحميلها وعرضها بواسطة Glide بسهولة مثل الصور الثابتة. تكتشف المكتبة التنسيق تلقائياً حسب نوع MIME وتفك تشفير الحركة، وتعرض الإطارات في خلفية المعالجة. تتوفر طريقتا asGif و asBitmap للتحكم في التشغيل.
ترتبط Glide تلقائياً بدورة حياة Activity و Fragment و View. عند إيقاف Activity، يتم تعليق التحميل؛ وعند التدمير، يتم إلغاؤه. يمنع هذا تسرب الذاكرة وتحميل الصور للشاشات المغلقة بالفعل. يعمل التكامل من خلال دعم LifecycleOwner.
يمكن Glide استخراج إطارات من الفيديو عبر URL أو مسار محلي. تُستخدم طريقة asBitmap() مع load() لعناوين URI للفيديو. تختار Glide تلقائياً إطاراً رئيسياً أو إطاراً في طابع زمني محدد. هذا مفيد لعرض معاينات الفيديو.
GlideApp هي فئة مولدة توفر API موسعاً بناءً على تكوين AppGlideModule. تسمح باستخدام طرق غير متوفرة في Glide.with القياسي: التحميل بخيارات مخصصة افتراضية، والتكامل مع المكتبات، والتحويلات المسبقة الإعداد. يتطلب التوليد التعليق @GlideModule في فئة ترث AppGlideModule.
Glide تستخدم بنية متعددة المستويات مع محرك وأجهزة فك التشفير والتحويلات والذاكرة المؤقتة. يمر كل طلب عبر سلسلة من المعالجات التي تحسن التحميل لـ ImageView معين.
عند استدعاء into(view)، تتحقق Glide من الذاكرة المؤقتة: الموارد النشطة، ذاكرة التخزين المؤقت، ذاكرة التخزين على القرص، ثم الشبكة فقط. يتم تحجيم الصورة تلقائياً لحجم ImageView الهدف مع مراعاة كثافة الشاشة و scaleType. يقلل هذا من استخدام الذاكرة — وهي ميزة رئيسية لـ Glide.
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.override(400, 300)
.centerCrop()
.into(imageView)
تثبيت Glide يتم عبر Gradle. تتطلب المكتبة تكويناً عبر AppGlideModule لتوليد API. الحد الأدنى لإصدار Android API هو 21.
في build.gradle، أضف Glide مع معالج التعليقات kapt لتوليد API GlideApp. بالنسبة لـ Kotlin، استخدم kapt بدلاً من annotationProcessor. الإصدار 4.16+ من Glide يعمل بثبات مع Android Gradle Plugin 8.x.
dependencies {
implementation "com.github.bumptech.glide:glide:4.16.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.16.0"
}
// استخدم kapt لـ Kotlin
// kapt "com.github.bumptech.glide:compiler:4.16.0"
AppGlideModule هو مكون إلزامي لتكوين Glide. يتيح تعيين حجم الذاكرة المؤقتة و HttpStack مخصص وتسجيل أجهزة فك التشفير الخاصة. يتم فحص الوحدة بواسطة Glide عند بدء التطبيق. التعليق @GlideModule يسجلها تلقائياً.
@GlideModule
public class MyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
int diskCacheSize = 250 * 1024 * 1024;
builder.setDiskCache(
new DiskLruCacheFactory(cacheDir.getPath(), diskCacheSize)
);
}
}
الأمثلة أدناه توضح سيناريوهات نموذجية: تحميل الصور والعمل مع GIF واستخراج إطارات الفيديو.
التحميل الأساسي عبر Glide.with().load().into() — الحد الأدنى من الكود لعرض صورة من الشبكة. تضبط Glide تلقائياً حجم ImageView. يظهر placeholder أثناء التحميل ويظهر error عند الفشل.
Glide.with(fragment)
.load("https://example.com/photo.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView)
GIF يتم تحميله بنفس طريقة الصورة الثابتة — تكتشف Glide التنسيق تلقائياً حسب نوع المحتوى. للتحميل الإجباري كصورة ثابتة، استخدم asBitmap()؛ ولـ GIF، استخدم asGif(). تقوم Glide بفك تشفير الإطارات المرئية فقط بكفاءة.
Glide.with(context)
.asGif()
.load("https://example.com/animation.gif")
.into(imageView)
// تحميل الإطار الأول من GIF كصورة ثابتة
Glide.with(context)
.asBitmap()
.load("https://example.com/animation.gif")
.into(imageView)
يتم استخراج إطار الفيديو بواسطة Glide من URI فيديو محلي أو بعيد. افتراضياً، تقوم Glide بتحميل الإطار الرئيسي. لتحديد طابع زمني محدد، استخدم frameMillis. هذا مناسب لعرض المعاينات في معرض الفيديو.
String videoUrl = "https://example.com/video.mp4";
Glide.with(context)
.asBitmap()
.load(videoUrl)
.override(200, 200)
.into(imageView)
تحسين Glide لـ RecyclerView هو مهارة أساسية عند تطوير التطبيقات التي تحتوي على عدد كبير من الصور. التكوين الصحيح يمنع التأخير وأخطاء OOM.
إحدى الميزات الرئيسية لـ Glide هي التكامل مع RecyclerView عبر RecyclerViewPreloader. يقوم هذا المكون بتحليل سرعة التمرير واتجاهه، محمّلاً مسبقاً الصور التي ستظهر على الشاشة بعد بضعة عناصر. لاستخدام المحمل المسبق، تحتاج إلى تنفيذ واجهة PreloadSizeProvider وتمريرها إلى المنشئ مع ImageView الهدف.
استخدام طريقة override() بأبعاد ImageView الدقيقة يسرع التحميل بشكل كبير. عندما تعرف Glide الحجم الدقيق للهدف، يمكنها فك تشفير الصورة مباشرة بالدقة المطلوبة، متجاوزة خطوة التحجيم. يقلل هذا من وقت فك التشفير واستهلاك الذروة للذاكرة بنسبة 30–40%.
للخلاصات ذات المحتوى غير المتجانس، استخدم RequestOptions مختلفة لكل نوع عنصر. على سبيل المثال، للصور الكبيرة كلافتات، يمكنك تعيين override(1200, 600) وجودة RGB_565، وبالنسبة للصور الرمزية — override(200, 200) وتدوير عبر transform. هذا النهج يستخدم الموارد بشكل أمثل لكل نوع محتوى.
توفر Glide خيارات مرنة لمعالجة الأخطاء من خلال صور الخطأ و RequestListener المخصص. يتيح RequestListener التفاعل مع التحميل الناجح أو الفشل — تسجيل الأخطاء أو إرسال التحليلات. يمكنك أيضاً تكوين fallback — صورة تظهر عندما يتلقى load() قيمة null بدلاً من رابط.
استخدم RecyclerViewPreloader لتحميل الصور مسبقاً قبل أن يقوم المستخدم بالتمرير إليها. تدعم Glide التكامل مع RecyclerView من خلال محمل مسبق يحلل سرعة التمرير ويحمل الصور مسبقاً.
تعدد الصور المصغرة يتيح عرض نسخة مصغرة من الصورة أولاً، ثم تحميل النسخة الكاملة. استدعاء thumbnail(0.25f) يحمّل نسخة بحجم 25% تظهر فوراً، بينما يتم تحميل الصورة كاملة الحجم لاحقاً. يخلق هذا انطباعاً بالتحميل الفوري.
بالنسبة لمحولات القوائم، استخدم .override() بأبعاد ImageView دقيقة حتى لا تقوم Glide بقياس الصورة في كل مرة. يقلل هذا من حمل وحدة المعالجة المركزية واستهلاك الذاكرة. يتم اختيار حجم الذاكرة المؤقتة تجريبياً، لكن 250 ميجابايت للقرص و 20% من الذاكرة المتوفرة هي نقطة بداية جيدة.
الأسئلة الشائعة
Glide تدعم GIF وإطارات الفيديو و WebP المتحركة. تدير الذاكرة بكفاءة أكبر وتوصي بها Google. Picasso أصغر حجماً وأسهل في الاستخدام. للمشاريع المعقدة، اختر Glide.
Glide تقبل LifecycleOwner (Fragment, Activity) أو View. تتابع المكتبة الحالة تلقائياً عبر LifecycleObserver: توقف التحميل عند الإيقاف وتلغيه عند التدمير، مما يمنع تسرب الذاكرة.
نعم، استخدم asBitmap() قبل load(). ستقوم Glide بتحميل GIF كصورة ثابتة وعرض الإطار الأول فقط. هذا مفيد للقوائم حيث حركة GIF غير مرغوب فيها لأسباب تتعلق بالأداء.
يتكون التخزين المؤقت لـ Glide من ثلاثة مستويات: الموارد النشطة (قيد الاستخدام حالياً)، الذاكرة (ذاكرة LRU مؤقتة)، والقرص (LruCache). يتم عرض الصور المحملة من الذاكرة المؤقتة فوراً. يتم مسح الذاكرة المؤقتة تلقائياً عند انخفاض الذاكرة.
يتم تسجيل عميل HTTP مخصص عبر OkHttpUrlLoader في AppGlideModule. تجاوز registerComponents وسجل OkHttpClient الخاص بك. يتيح هذا إضافة المعترضات والشهادات والمهلات الزمنية المخصصة.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.