Redundant Downloads are Redundant[重複下載是冗餘的]
- 減少下載的最基本方法是僅僅下載那些你需要的[美國人的思維還是比較直接,雖然這句話看起來比較搞笑,但是很有道理]。從數據的角度看,我們可以通過傳遞類似上次更新時間這樣的參數來制定查詢某些數據。
- 同樣,在下載圖片的時候,server那邊最好能夠減少圖片的大小,而不是讓我們下載完整大小的圖片。
Cache Files Locally [緩存文件到本地]
- 避免下載重複的數據是很重要的。可以使用緩存機制來處理這個問題。緩存static的資源,例如完整的圖片。這些緩存的資源需要分開存放。
- 爲了保證app不會因爲緩存而導致顯示的是舊數據,請從緩存中獲取最新的數據,當數據過期的時候,會提示進行刷新。
- 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();
- 不管是存放在哪裏的文件都會在app卸載的時候被清除。
Use the HttpURLConnection Response Cache[使用HttpURLConnection Response緩存]
- 在Android 4.0裏面爲HttpURLConnection增加了一個response cache,我們可以使用反射機制開啓HTTP response cache,看下面的例子:
- 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.");
- }
- }
- 上面的sample code會在Android 4.0以上的設備上開啓response cache,同時不會影響到之前的程序。
- 在cache被開啓之後,所有cache中的HTTP請求都可以直接在本地存儲中進行響應,並不需要開啓一個新的網絡連接。
- 被cache起來的response可以被server所確保沒有過期,這樣就減少了帶寬。沒有被cached的response會因方便下次請求而被存儲在response cache中。