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