Modifying your Download Patterns Based on the Connectivity Type
[根據連接的網絡類型來更改下載模式]
- 並不是所有的網絡類型(Wi-Fi,3G,2G,etc)對電量的消耗是同等的。不僅僅Wi-Fi電波比無線電波消耗的電量要少很多,而且不同的無線電波(3G,2G,LTE……)也存在使用不同電量的區別。
Use Wi-Fi [使用Wi-Fi]
- 在大多數情況下,Wi-Fi電波會在使用相對較低的電量的情況下提供一個相對較寬的帶寬。因此,我們需要努力爭取儘量使用Wi-Fi來傳遞數據。
- 我們可以使用Broadcast Receiver來監聽當網絡連接切換爲Wi-Fi,這個時候我們可以進行大量的數據傳遞操作,例如下載,執行定時的更新操作,甚至是在這個時候加大更新的頻率。這些內容都可以在前面的課程中找到。
Use Greater Bandwidth to Download More Data Less Often [使用更大的帶寬來下載更多的數據,而不是經常去下載]
- 當通過無線電進行連接的時候,更高的帶寬通常伴隨着更多的電量消耗。這意味這LTE(一種4G網絡制式)會比3G制式消耗更多,當然比起2G,那就更是如此。
- 從Lesson 1我們知道了無線電狀態機是怎麼回事,通常來說相對更寬的帶寬網絡制式會有更長的狀態切換時間(也就是從full power過渡到standby有一段時間的延遲)。
- 同時,更寬的帶寬意味這可以更貪婪的進行prefetch,下載更多的數據。也許這個說法不是很直觀,因爲過渡時間比較長,而過渡時間的長短我們無法控制,也就是過渡時間的電量消耗差不多是固定了,既然這樣,我們在每次傳輸會話中爲了減少更新的頻率而把無線電激活的時間拉長,這樣顯的更有效率。
- 例如:如果LTE無線電的帶寬與電量消耗都是3G無線電的2倍,我們應該在每次會話的時候都下載4倍於3G的數據量,或者是差不多10Mb(前面文章有說明3G一般每次下載2Mb)。當然,下載到這麼多數據的時候,我們需要好好考慮prefetch本地存儲的效率並且需要經常刷新預取的cache。
- 我們可以使用connectivity manager來判斷當前激活的無線電波,並且根據不同結果來修改prefetch操作。
- ConnectivityManager cm =
- (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
- TelephonyManager tm =
- (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
- NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
- int PrefetchCacheSize = DEFAULT_PREFETCH_CACHE;
- switch (activeNetwork.getType()) {
- case (ConnectivityManager.TYPE_WIFI):
- PrefetchCacheSize = MAX_PREFETCH_CACHE; break;
- case (ConnectivityManager.TYPE_MOBILE): {
- switch (tm.getNetworkType()) {
- case (TelephonyManager.NETWORK_TYPE_LTE |
- TelephonyManager.NETWORK_TYPE_HSPAP):
- PrefetchCacheSize *= 4;
- break;
- case (TelephonyManager.NETWORK_TYPE_EDGE |
- TelephonyManager.NETWORK_TYPE_GPRS):
- PrefetchCacheSize /= 2;
- break;
- default: break;
- }
- break;
- }
- default: break;
- }
學習自:http://developer.android.com/training/efficient-downloads/connectivity_patterns.html
轉載請註明出處:http://blog.csdn.net/kesenhoo,謝謝!