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

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

الطريقة الأساسية لتقليل عمليات التنزيل هي تنزيل ما تحتاجه فقط. في ما يتعلق بالبيانات، يعني ذلك تنفيذ واجهات برمجة تطبيقات 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(). تجدر الإشارة إلى أنّه قد يتم محو ذاكرة التخزين المؤقت الداخلية هذه عندما توشك مساحة التخزين المتاحة على النفاد في النظام.

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

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