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

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

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

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

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