在很多场景下,我们都需要解决一些诸如轮训这样的问题。如果这样的算法出现在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); } }
时间: 2024-10-29 03:36:34