不耗電傳輸資料(三):避免多餘的下載
避免多餘的下載
很多使用者間歇性的聯網並且有下載量的限制。你可以鼓勵使用者與應用互動的時候儘量降低下載量。
降低下載量最根本的方式就是隻下載有用的資料。這裡的資料指的是實現了REST API,允許你指定查詢標準,用引數比如上次下載時間來限制返回的資料。
相似的,當下載圖片時,最好在伺服器端壓縮一下,而不是下載大圖片,再在本地壓縮顯示。
本地檔案緩衝
另一個重要的技術就是避免重複下載。你可以用緩衝來降低重複下載相同資料的可能性。通過緩衝應用資料和資源,你可以建立一個應用需要的資訊的本地副本。如果應用短期內需要多次訪問同一個資訊,那麼只需要下載一次到緩衝區就可以了。
為了降低總下載量,緩衝越多越好。只要合理,總是緩衝靜態資源,包括使用者請求的圖片的全文下載。使用者請求的資源應單獨儲存,以便定期重新整理緩衝區來管理他的大小。
為了確保你的應用顯示的不是過期的資訊,要從HTTP返回的頭資訊中解析出所請求的內容的上次更新時間和過期時間。這樣你就知道什麼時候該重新整理相關內容了。
// url represents the website containing the content to place into the cache.
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
long currentTime = System.currentTimeMillis();
long expires = conn.getHeaderFieldDate(
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;
}
用這個策略,你可以高效的動態緩衝資料並保證應用不顯示過期資訊。
你可以在非託管的外部緩衝路徑緩衝不是那麼敏感的資訊。
Context.getExternalCacheDir();
你也可以選擇用託管的安全的應用緩衝。注意內部緩衝可能會在系統記憶體地的時候被清掉。
Context.getCacheDir();
注意:不管存在哪個路徑下,當應用解除安裝的時候,資料都會被清掉。
用HttpsURLConnection 返回緩衝
Android4.0給HttpURLConnection添加了一個返回緩衝。你可以通過反射開啟這個返回緩衝。
private void enableHttpResponseCache() {
try {
long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
File httpCacheDir = new File(getCacheDir(), "http");
Class.forName("android.net.http.HttpResponseCache")
.getMethod("install", File.class, long.class)
.invoke(null, httpCacheDir, httpCacheSize);
} catch (Exception httpResponseCacheNotAvailable) {
Log.d(TAG, "HTTP response cache is unavailable.");
}
}
這段程式碼打開了Android4.0+裝置上的返回緩衝,並且相容了之前的版本。
緩衝安裝後,完全緩衝的HTTP請求可以直接從本地下載,避免了開啟網路連線。緩衝的資料有條件的情況下可以與伺服器同步,降低了下載所需頻寬。