לחלק מהמשתמשים באפליקציה יש גישה לסירוגין לאינטרנט או מגבלות על כמות המידע שהם יכולים להוריד למכשירים שלהם. כדי לעודד את המשתמשים לבצע אינטראקציה עם האפליקציה בתדירות גבוהה יותר, תוכלו להפחית את כמות הנתונים שהאפליקציה צריכה להוריד.
הדרך הבסיסית ביותר לצמצם את ההורדות היא להוריד רק את מה שדרוש לכם. מבחינת נתונים, המשמעות היא הטמעת ממשקי API ל-REST שמאפשרים לציין קריטריונים לשאילתות שמגבילים את הנתונים המוחזרים באמצעות פרמטרים כמו השעה של העדכון האחרון.
באופן דומה, כשמורידים תמונות, מומלץ להקטין את הגודל שלהן בצד השרת, במקום להוריד תמונות בגודל מלא שמופחתות בצד הלקוח.
שמירת תגובות HTTP במטמון
שיטה חשובה נוספת היא להימנע משימוש בהורדה של נתונים כפולים. כדי לצמצם את הסבירות להורדה חוזרת של אותו קטע נתונים, אפשר להשתמש במטמון. שמירת הנתונים והמשאבים של האפליקציה במטמון יוצרת עותק מקומי של המידע שהאפליקציה צריכה להפנות אליו. אם האפליקציה צריכה לגשת לאותו מידע כמה פעמים בפרק זמן קצר, צריך להוריד אותו למטמון רק פעם אחת.
חשוב לאחסן במטמון באופן פעיל ככל האפשר כדי לצמצם את כמות הנתונים הכוללת שאתם מורידים. תמיד כדאי לשמור במטמון משאבים סטטיים, כולל הורדות על פי דרישה כמו תמונות בגודל מלא, למשך זמן רב ככל האפשר. צריך לאחסן משאבים על פי דרישה בנפרד כדי שתוכלו לנקות את המטמון על פי דרישה באופן קבוע ולנהל את הגודל שלו.
כדי לוודא שהאחסון במטמון לא יוביל להצגת נתונים לא עדכניים באפליקציה, צריך להשתמש בכותרות ובקודי סטטוס HTTP המתאימים, כמו הכותרות ETag
ו-Last-Modified
. כך תוכלו לקבוע מתי התוכן המשויך צריך להתעדכן. לדוגמה:
// 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 }
// 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, כפי שמוצג בדוגמת הקוד הבאה:
val cacheDir = Context.getCacheDir() val cacheSize = 10L * 1024L * 1024L // 10 MiB val client: OkHttpClient = OkHttpClient.Builder() .cache(Cache(cacheDir, cacheSize)) .build()
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()
.
שימו לב שהמטמון הפנימי הזה עשוי להתרוקן כשנפח האחסון הזמין במערכת עומד להיגמר.
שימוש במאגר
אם רוצים גישה מתוחכמת יותר לשמירה במטמון, כדאי לשקול את תבנית העיצוב של Repository. לשם כך, יוצרים כיתה בהתאמה אישית שנקראת מאגר, שמספקת הפשטה של API על נתונים או משאבים ספציפיים. המאגר עשוי לאחזר בהתחלה את הנתונים שלו ממקורות שונים, כמו שירות אינטרנט מרוחק, אבל בקריאות הבאות הוא יספק למתקשרים גרסה של הנתונים במטמון. שכבת העקיף הזו מאפשרת לכם לספק אסטרטגיית מטמון חזקה וייחודית לאפליקציה. מידע נוסף על השימוש בתבנית המאגר באפליקציה זמין במדריך לארכיטקטורת אפליקציות.