<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                > 編寫:[kesenhoo](https://github.com/kesenhoo) - 原文:[http://developer.android.com/training/efficient-downloads/regular-update.html](http://developer.android.com/training/efficient-downloads/regular-update.html) 最佳的定時更新頻率是不確定的,通常由設備狀態,網絡連接狀態,用戶行為與用戶定義明確的偏好而決定。 [Optimizing Battery Life](http://developer.android.com/training/monitoring-device-state/index.html)這一章有討論如何根據設備狀態來修改更新頻率,從而達到編寫一個低電量消耗的程序。可執行的操作包括當斷開網絡連接的時候去關閉后臺服務,在電量比較低的時候減少更新的頻率等。 這一課會介紹更新頻率是多少才會使得更新操作對無線電狀態機的影響最小。(C2DM與指數退避算法的使用) ### 1)Use Google Cloud Messaging as an Alternative to Polling 關于`Google Cloud Messaging for Android` (GCM)詳情 ,請參考:[http://developer.android.com/google/gcm/index.html](http://developer.android.com/google/gcm/index.html) 每次app去向server詢問檢查是否有更新操作的時候會激活無線電,這樣造成了不必要的能量消耗(在3G情況下,會差不多消耗20秒的能量)。 GCM是一個用來從server到特定app傳輸數據的輕量級的機制。使用GCM,server會在某個app有需要獲取新數據的時候通知app有這個消息。 比起輪詢方式(app為了即時拿到最新的數據需要定時向server請求數據),GCM這種有事件驅動的模式會在僅僅有數據更新的時候通知app去創建網絡連接來獲取數據(很顯然這樣減少了app的大量操作,當然也減少了很多電量消耗)。 GCM需要通過使用固定TCP/IP連接來實現操作。當在你的設備上可以實現固定IP的時候,最好使用GCM。(這個地方應該不是傳統意義上的固定IP,可以理解為某個會話情況下)。很明顯,使用GCM既減少了網絡連接次數,也優化了帶寬,還減少了對電量的消耗。 **Ps:大陸的Google框架通常被移除掉,這導致GCM實際上根本沒有辦法在大陸的App上使用** ### 2)Optimize Polling with Inexact Repeating Alarms and Exponential Backoffs 如果需要使用輪詢機制,在不影響用戶體驗的前提下,當然設置默認更新頻率是越低越好(減少電量的浪費)。 一個簡單的方法是給用戶提供更新頻率的選擇,允許用戶自己來處理如何平衡數據及時性與電量的消耗。 當設置安排好更新操作后,可以使用不確定重復提醒的方式來允許系統把當前這個操作進行定向移動(比如推遲一會)。 ~~~ int alarmType = AlarmManager.ELAPSED_REALTIME; long interval = AlarmManager.INTERVAL_HOUR; long start = System.currentTimeMillis() + interval; alarmManager.setInexactRepeating(alarmType, start, interval, pi); ~~~ 若是多個提醒都安排在某個點同時被觸發,那么這樣就可以使得多個操作在同一個無線電狀態下操作完。 如果可以,請設置提醒的類型為`ELAPSED_REALTIME` or `RTC`而不是`_WAKEUP`。這樣能夠更進一步的減少電量的消耗。 我們還可以通過根據app被使用的頻率來有選擇性的減少更新的頻率。 另一個方法是在app在上一次更新操作之后還未被使用的情況下,使用指數退避算法`exponential back-off algorithm`來減少更新頻率。當然我們也可以使用一些類似指數退避的方法。 ~~~ SharedPreferences sp = context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE); boolean appUsed = sp.getBoolean(PREFS_APPUSED, false); long updateInterval = sp.getLong(PREFS_INTERVAL, DEFAULT_REFRESH_INTERVAL); if (!appUsed) if ((updateInterval *= 2) > MAX_REFRESH_INTERVAL) updateInterval = MAX_REFRESH_INTERVAL; Editor spEdit = sp.edit(); spEdit.putBoolean(PREFS_APPUSED, false); spEdit.putLong(PREFS_INTERVAL, updateInterval); spEdit.apply(); rescheduleUpdates(updateInterval); executeUpdateOrPrefetch(); ~~~ 初始化一個網絡連接的花費不會因為是否成功下載了數據而改變。我們可以使用指數退避算法來減少重復嘗試(retry)的次數,這樣能夠避免浪費電量。例如: ~~~ private void retryIn(long interval) { boolean success = attemptTransfer(); if (!success) { retryIn(interval*2 < MAX_RETRY_INTERVAL ? interval*2 : MAX_RETRY_INTERVAL); } } ~~~ **筆者結語:這一課講到GCM與指數退避算法等,其實這些細節很值得我們注意,如果能在實際項目中加以應用,很明顯程序的質量上升了一個檔次!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看