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