標籤:
在很多情境下,我們都需要解決一些諸如輪訓這樣的問題。如果這樣的演算法出現在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); }}
指數退避演算法exponential back-off algorithm