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

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

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

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

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

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

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