לחלק מהמשתמשים באפליקציה יש גישה לסירוגין לאינטרנט או מגבלות על כמות המידע שהם יכולים להוריד למכשירים שלהם. כדי לעודד משתמשים לקיים אינטראקציה עם האפליקציה בתדירות גבוהה יותר, כדאי לצמצם את כמות הנתונים שהאפליקציה צריכה להוריד.
הדרך הבסיסית ביותר לצמצם את ההורדות היא להוריד רק את מה שדרוש לכם. מבחינת נתונים, המשמעות היא הטמעת ממשקי API ל-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()
.
חשוב לזכור שיכול להיות שהמטמון הפנימי הזה יימחק כשהאחסון הזמין במערכת יהיה נמוך.
שימוש במאגר
כדי לקבל גישה מתוחכמת יותר לשמירת נתונים במטמון, כדאי להשתמש בתבנית העיצוב של המאגר. לשם כך, יוצרים כיתה בהתאמה אישית שנקראת מאגר, שמספקת הפשטה של API על נתונים או משאבים ספציפיים. בהתחלה, המאגר עשוי לאחזר את הנתונים שלו ממקורות שונים, כמו שירות אינטרנט מרוחק, אבל הוא מספק למבצעי הקריאה גרסה שמאוחסנת במטמון של הנתונים בקריאות הבאות. שכבת העקיף הזו מאפשרת לכם לספק אסטרטגיית מטמון חזקה וייחודית לאפליקציה. מידע נוסף על השימוש בתבנית המאגר באפליקציה זמין במדריך לארכיטקטורת אפליקציות.