本博文為博主搜集的有關 Android 優化網絡連接以盡可能減少電量消耗的相關知識,文中內容如有不恰當之處,還望指正,謝謝!
前言
移動端電池容量有限,所以移動端應用開發在進行網絡請求時應盡可能減少電量消耗,即最小化下載,網絡連接,尤其是無線電連接對電量的影響,從而提升應用性能和用戶體驗。APP 的電量消耗與當前使用的網絡連接類型、采用的網絡傳輸方式、單次網絡傳輸時長及網絡傳輸次數等因素均有關。以下分別介紹相應的優化建議。
優化建議
數據預取:預取數據是一種減少獨立數據傳輸會話數量的有效方法。預取技術指的是在一定時間內,單次連接操作,以最大的下載能力來下載所有用戶可能需要的數據;
批量處理傳送和連接:每次發起一個連接,不論相關傳送數據的大小,當使用典型的 3G 無線網絡時,可能會導致無線電波消耗大約 20 秒的電量。一個 app 每 20 秒 ping 一次服務器,僅僅是為了確認 app 正在運行和對用戶可見,那么無線電波會無限期地處于開啟狀態,而無線電波處于開啟狀態時的電量消耗是很大的,從而導致即使沒有實際數據傳輸,應用程序仍會消耗大量電量。因此,對傳送的數據進行捆綁操作和創建一個等待傳輸隊列就顯得非常重要。操作正確的話,可以使得大量的數據集中進行發送,這樣使得無線電波的激活時間盡可能的少,同時減少大部分電量的消耗。這樣做的潛在好處是盡可能在每次傳輸數據的會話中盡可能多地傳輸數據,從而減少會話次數;
減少連接:重用已經存在的網絡連接比起重新建立一個新的連接更有效率。重用網絡連接同樣可以使得在擁擠不堪的網絡環境中進行更加智能的反應,如果過早對一個連接執行關閉操作,會導致需要額外的開銷來建立一個新的連接,一個比較恰當地關閉連接的時間點為延遲關閉到 timeout 之前;
最小化定期更新造成的影響:
- 在可能的情況下,轉變輪詢方式為服務器推送方式來進行數據同步;
- 在分析應用程序特性時,在不影響用戶使用的前提下,將更新頻率設置得越低越好;
- 也可以將輪詢頻率與電量平衡的選擇轉移給用戶,由用戶自己進行選擇;
- 使用指數退避算法來減少更新頻率;
** 使用緩存策略避免請求重復數據:**可以使用內存緩存,或磁盤緩存對已加載的數據加以緩存,然后在下一次請求時,優先從緩存中獲取數據,緩存不命中再進行網絡請求。使用緩存時需要根據應用特點設置緩存過期時間及緩存策略;
使用 HttpURLConnection 響應緩存:Android 4.0 里面為 HttpURLConnection 增加了一個響應緩存,在 cache 被開啟之后,所有 cache 中的 HTTP 請求都可以直接在本地存儲中進行響應,并不需要開啟一個新的網絡連接。可以使用反射機制開啟 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.");
}
}
根據網絡連接類型來調整下載模式:不同的網絡連接類型對電量的消耗是不一樣的,一般而言, Wi-Fi 對電量的消耗會比無線電波,如 3G、2G 要小很多,所以應該盡可能使用 Wi-Fi 來進行網絡請求。可以使用 Broadcast Receiver 來監聽網絡連接狀態的變化。當切換為 Wi-Fi 時,進行大量的數據傳遞操作,例如下載,執行定時的更新操作,甚至是在這個時候暫時加大更新頻率;
使用檢測工具,如 DDMS Network Traffic Tool 來監測 app 是在何時,如何傳輸數據的,根據監測結果進行代碼的優化。