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

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

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

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

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