指數退避算法exponential back-off algorithm

在很多場景下,我們都需要解決一些諸如輪訓這樣的問題。如果這樣的算法出現在app上,這種輪訓對於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);
  }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章