根據(jù)Android的網(wǎng)絡(luò)連接類型來調(diào)整下載模式

2018-08-02 17:42 更新

編寫:kesenhoo - 原文:http://developer.android.com/training/efficient-downloads/connectivity_patterns.html

所有的網(wǎng)絡(luò)類型(Wi-Fi、3G、2G等)對電量的消耗并不是一樣的。不僅是 Wi-Fi 電波比無線電波的耗電量要少很多,而且不同的無線電波(3G、2G、LTE……)使用的電量也不同。

使用 Wi-Fi

在大多數(shù)情況下,Wi-Fi 電波會(huì)在使用相對較低電量的情況下提供一個(gè)相對較大的帶寬。因此,我們需要爭取盡量使用 Wi-Fi 來傳遞數(shù)據(jù)。

我們可以使用 Broadcast Receiver 來監(jiān)聽網(wǎng)絡(luò)連接狀態(tài)的變化。當(dāng)切換為 Wi-Fi 時(shí),我們可以進(jìn)行大量的數(shù)據(jù)傳遞操作,例如下載,執(zhí)行定時(shí)的更新操作,甚至是在這個(gè)時(shí)候暫時(shí)加大更新頻率。這些內(nèi)容都可以在前面的課程中找到。

使用更大的帶寬來更不頻繁地下載更多數(shù)據(jù)

當(dāng)通過無線電進(jìn)行連接的時(shí)候,更大的帶寬通常伴隨著更多的電量消耗。這意味著 LTE(一種4G網(wǎng)絡(luò)制式)會(huì)比 3G 制式更耗電,當(dāng)然比起 2G 更甚。

從 Lesson 1 我們知道了無線電狀態(tài)機(jī)是怎么回事,通常來說相對更寬的帶寬網(wǎng)絡(luò)制式會(huì)有更長的狀態(tài)切換時(shí)間(也就是從 full power 過渡到 standby 有更長一段時(shí)間的延遲)。

同時(shí),更高的帶寬意味著可以更大量的進(jìn)行預(yù)取,下載更多的數(shù)據(jù)。也許這個(gè)說法不是很直觀,因?yàn)檫^渡的時(shí)間比較長,而過渡時(shí)間的長短我們無法控制,也就是過渡時(shí)間的電量消耗差不多是固定了。既然這樣,我們在每次傳輸會(huì)話中為了減少更新的頻率而把無線電激活的時(shí)間拉長,這樣顯的更有效率。也就是盡量一次性把事情做完,而不是斷斷續(xù)續(xù)的請求。

例如:如果 LTE 無線電的帶寬與電量消耗都是 3G 無線電的2倍,我們應(yīng)該在每次會(huì)話的時(shí)候都下載4倍于 3G 的數(shù)據(jù)量,或者是差不多 10Mb(前面文章有說明 3G 一般每次下載 2Mb)。當(dāng)然,下載到這么多數(shù)據(jù)的時(shí)候,我們需要好好考慮預(yù)取本地存儲(chǔ)的效率并且需要經(jīng)常刷新預(yù)取的緩存。

我們可以使用 connectivity manager 來判斷當(dāng)前激活的無線電波,并且根據(jù)不同結(jié)果來修改預(yù)取操作。

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;
}

Ps:想要最大化效率與最小化電量的消耗,需要考慮的東西太多了,通常來說,會(huì)根據(jù) app 的功能需求來選擇有所側(cè)重,那么前提就是需要了解到底哪些對效率的影響比較大,這有利于我們做出最優(yōu)選擇。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)