1. 程式人生 > >不耗電傳輸資料(三):避免多餘的下載

不耗電傳輸資料(三):避免多餘的下載

避免多餘的下載

很多使用者間歇性的聯網並且有下載量的限制。你可以鼓勵使用者與應用互動的時候儘量降低下載量。

降低下載量最根本的方式就是隻下載有用的資料。這裡的資料指的是實現了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(

"Expires", currentTime);
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請求可以直接從本地下載,避免了開啟網路連線。緩衝的資料有條件的情況下可以與伺服器同步,降低了下載所需頻寬。