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

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

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