Android---冗餘的下載是多餘的



本文譯自: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請求可以直接從本地緩存中獲取服務,而無需打開網絡連接。有條件的緩存響應結果,可以有效的驗證來自服務端的數據的新鮮度,從而消除相關下載的帶寬成本。

從響應緩存中獲取未被緩存的響應會引發新的請求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章