本文譯自:http://developer.android.com/training/efficient-downloads/redundant_redundant.html
減少下載的最基本的方法是隻下載必要的數據,在數據方面,意味着要實現REST API,這些API允許使用參數來指定查詢條件,從而限定返回的數據,如指定最後一次更新的時間。
同樣,當下載圖片時,好的做法是在服務端減少圖片的尺寸,而不是下載全尺寸的圖片。
本地緩存文件
另一項重要的技術是避免下載重複的數據。可以通過緩存來做這件事情。只要合理,就始終要包一些靜態資源,包括那些按需下載的諸如全尺寸的圖片等放到緩存中。按需下載的資源應該被分開存儲,這樣可以定期的刷新這塊緩存,以便管理緩存的大小。
爲了確保緩存不會導致應用程序顯示過期的數據,一定要提取最後更新的請求內容的時間,這個時間位於HTTP響應頭中。這就允許你判斷相關的內容被刷新的時機。
long currentTime
=
System.currentTimeMillis());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
long expires = conn.getHeaderFieldDate("Expires", currentTime);
long lastModified = conn.getHeaderFieldDate("Last-Modified", currentTime);
setDataExpirationDate(expires);
if (lastModified <lastUpdateTime) {
// Skip update
} else {
// Parse update
}
使用這種方法,還可以有效的緩存動態內容,同時確保不會導致應用程序顯示過期的信息。
你可以在非託管的緩存目錄中緩存非敏感數據:
Context.getExternalCacheDir();
還可以使用託管或安全的應用程序緩存。需要注意的是,這種內部緩存可能在系統運行時內存低於可用存儲時被清空。
Context.getCache();
存儲在緩存位置的文件會在應用程序卸載時被刪除。
使用HttpURLConnection響應緩存
Android4.0把一個響應緩存添加到HttpURLConnection類中。你可以使用下列反射方法,在被支持的設備上啓用HTTP響應緩存:
private
voidenableHttpResponseCache()
{
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 responsecache is unavailable.");
}
}
上述示例代碼會在Android4.0以上的設備上打開響應緩存而不影響早期的版本。
使用被安裝的緩存,HTTP請求可以直接從本地緩存中獲取服務,而無需打開網絡連接。有條件的緩存響應結果,可以有效的驗證來自服務端的數據的新鮮度,從而消除相關下載的帶寬成本。
從響應緩存中獲取未被緩存的響應會引發新的請求。