避免使用尚未最佳化的下載內容

部分應用程式的使用者會不間斷地存取網際網路,或對裝置可下載的資訊量有限制。您可以減少應用程式需要下載的資料量,鼓勵使用者更頻繁地與應用程式互動。

減少下載次數最基本的方法,就是只下載所需內容。就資料而言,這意味著您可以實作 REST API,以透過參數 (例如上次更新的時間) 指定查詢條件,限制傳回的資料。

同樣地,下載圖片時,建議縮減伺服器端的圖片尺寸,而非下載在用戶端會縮減的原尺寸圖片。

快取 HTTP 回應

另一項重要技巧是避免下載重複的資料。您可以使用快取,降低重複下載相同資料的可能性。透過快取應用程式的資料和資源,您可以建立應用程式需要參照的資訊本機副本。如果您的應用程式需要在短時間內多次存取相同的資訊,您只需要將其下載至快取中一次。

為了減少下載的資料總量,請務必盡可能積極快取。一律快取靜態資源 (包括原尺寸圖片等隨選下載) 的時間,直到在合理可行範圍內為止。以量計價資源應分開儲存,以便讓您定期清除隨選快取,藉此管理其大小。

為確保快取功能不會讓應用程式顯示過時資料,請使用適當的 HTTP 狀態碼和標頭,例如 ETagLast-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 抽象化機制。存放區一開始可能會從各種來源 (例如遠端網路服務) 擷取資料,但在後續呼叫中,可為呼叫端提供資料快取版本。這種間接機制可讓您為應用程式提供專屬的完善快取策略。如要進一步瞭解如何在應用程式內使用存放區模式,請參閱「應用程式架構指南」。