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