הימנעות מהורדות לא אופטימליות

לחלק מהמשתמשים באפליקציה יש גישה לסירוגין לאינטרנט או מגבלות על כמות המידע שהם יכולים להוריד למכשירים שלהם. כדי לעודד משתמשים לקיים אינטראקציה עם האפליקציה בתדירות גבוהה יותר, כדאי לצמצם את כמות הנתונים שהאפליקציה צריכה להוריד.

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

שימוש במאגר

כדי לקבל גישה מתוחכמת יותר לשמירת נתונים במטמון, כדאי להשתמש בתבנית העיצוב של המאגר. במסגרת התהליך הזה, יוצרים מחלקה מותאמת אישית שנקראת Repository, שבה ה-API מפשט נתונים או משאב ספציפי. המאגר עשוי לאחזר בהתחלה את הנתונים שלו ממקורות שונים, כמו שירות אינטרנט מרוחק, אבל בקריאות הבאות הוא יספק למתקשרים גרסה של הנתונים במטמון. שכבת העקיפה הזו מאפשרת לספק אסטרטגיית שמירה במטמון שהיא ספציפית לאפליקציה שלכם. במדריך לארכיטקטורת אפליקציות תוכלו לקרוא מידע נוסף על השימוש בתבנית המאגר באפליקציה.