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

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

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

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

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