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

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

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