تجنُّب عمليات التنزيل غير المحسَّنة

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

الطريقة الأساسية الأولى لتقليل التنزيلات هي تنزيل ما تحتاج إليه فقط. في ما يخص البيانات، هذا يعني تنفيذ واجهات برمجة تطبيقات REST التي تتيح لك تحديد معايير طلب البحث التي تحدّ من البيانات المعروضة باستخدام معلَمات مثل وقت آخر تعديل.

وبالمثل، عند تنزيل الصور، يُستحسَن تقليل حجم الصور من جهة الخادم بدلاً من تنزيل صور بالحجم الكامل يتم تصغيرها على العميل.

ذاكرة التخزين المؤقت لاستجابات HTTP

هناك أسلوب آخر مهمّ وهو تجنُّب تنزيل البيانات المكرّرة. يمكنك تقليل احتمالية تنزيل الجزء نفسه من البيانات بشكل متكرّر باستخدام التخزين المؤقت. عن طريق تخزين بيانات وموارد تطبيقك في ذاكرة التخزين المؤقت، يمكنك إنشاء نسخة محلية من المعلومات التي يحتاج تطبيقك إلى الرجوع إليها. إذا كان تطبيقك يحتاج إلى الوصول إلى المعلومات نفسها عدة مرات خلال فترة زمنية قصيرة، فستحتاج إلى تنزيلها في ذاكرة التخزين المؤقت مرة واحدة فقط.

من المهم التخزين المؤقت بشكل نشط قدر الإمكان لتقليل إجمالي حجم البيانات التي تنزّلها. احرص دائمًا على التخزين المؤقت للموارد الثابتة، بما في ذلك عمليات التنزيل عند الطلب مثل الصور بالحجم الكامل، لأطول فترة ممكنة بشكل معقول. يجب تخزين الموارد المتوفرة عند الطلب بشكل منفصل لتتمكن من مسح ذاكرة التخزين المؤقت عند الطلب بانتظام لإدارة حجمها.

لضمان ألا يؤدي التخزين المؤقت إلى عرض بيانات قديمة في تطبيقك، استخدِم رؤوس ورموز حالة HTTP المناسبة، مثل العنوانين ETag وLast-Modified. يتيح لك ذلك تحديد الوقت المناسب لإعادة تحميل المحتوى المرتبط على سبيل المثال:

Kotlin

// url represents the website containing the content to place into the cache.
val conn: HttpsURLConnection = url.openConnection() as HttpsURLConnection
val currentTime: Long = System.currentTimeMillis()
val lastModified: Long = conn.getHeaderFieldDate("Last-Modified", currentTime)

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified
}

Java

// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);

// lastUpdateTime represents when the cache was last updated.
if (lastModified < lastUpdateTime) {
    // Skip update
} else {
    // Parse update
    lastUpdateTime = lastModified;
}

يمكنك تهيئة بعض مكتبات الشبكات للحرص على رموز الحالة والرؤوس هذه تلقائيًا. عند استخدام OkHttp، على سبيل المثال، يؤدي ضبط دليل ذاكرة التخزين المؤقت وحجم ذاكرة التخزين المؤقت للبرنامج إلى تمكين المكتبة من استخدام التخزين المؤقت عبر HTTP، كما هو موضّح في نموذج الرمز التالي:

Kotlin

val cacheDir = Context.getCacheDir()
val cacheSize = 10L * 1024L * 1024L // 10 MiB
val client: OkHttpClient = OkHttpClient.Builder()
    .cache(Cache(cacheDir, cacheSize))
    .build()

Java

File cacheDir = Context.getCacheDir();
long cacheSize = 10L * 1024L * 1024L; // 10 MiB
OkHttpClient client = new OkHttpClient.Builder()
    .cache(new Cache(cacheDir, cacheSize))
    .build();

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

يمكنك تخزين البيانات غير الحسّاسة في دليل ذاكرة التخزين المؤقت الخارجي غير المُدار باستخدام Context.getExternalCacheDir(). بدلاً من ذلك، يمكنك تخزين البيانات مؤقتًا في ذاكرة التخزين المؤقت للتطبيقات المُدارة والآمنة باستخدام Context.getCacheDir(). يُرجى العِلم أنّه قد يتم محو ذاكرة التخزين المؤقت الداخلية هذه عند انخفاض مساحة التخزين المتاحة في النظام.

استخدام مستودع

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