部分應用程式使用者無法穩定連上網際網路,或可下載到裝置的資訊量有限。您可以減少應用程式需要下載的資料量,鼓勵使用者更常與應用程式互動。
減少下載量的最基本方法,就是只下載需要的內容。就資料而言,這表示導入 REST API,讓您指定查詢條件,並使用參數 (例如上次更新時間) 限制傳回的資料。
同樣地,下載圖片時,建議在伺服器端縮減圖片大小,而非下載完整大小的圖片,再由用戶端縮減。
快取 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 抽象層。存放區最初可能會從各種來源 (例如遠端網路服務) 擷取資料,但後續呼叫時會提供資料的快取版本給呼叫端。這個間接層可讓您提供專為應用程式設計的強大快取策略。如要進一步瞭解如何在應用程式中使用 Repository 模式,請參閱「應用程式架構指南」。