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

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

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