我正在开发一个用于Android的音频配置文件切换器,作为整个项目的一部分,我有一个使用以下计时器代码在后台运行的服务:
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {.....}, 0, nextUpdateInterval);
我注意到的是计时器没有遵守动态生成的下一个更新间隔时间... nextUpdateInterval被声明为私有静态long,初始化为30000(30秒),第一次运行....然后一次找到一个配置文件,我做了一些数学运算并更新nextUpdateInterval ...我已经将nextUpdateInterval值转换回小时/分钟以进行调试,并且计算正在按预期工作...就像它以小时和分钟显示我,当下一次计时器执行时......
nextUpdateInterval计算:long entirePeriodDiff = toTimeMiliseconds - fromTimeMiliseconds;
然后一旦找到一个配置文件,我就像这样计算elapsedTime:long elapsedTime = rightNowDate.getTime() - fromDate.getTime();
然后我更新nextUpdateInterval:nextUpdateInterval = entirePeriodDiff - elapsedTime;
一个示例场景:“工作”的配置文件设置从上午9点到下午4点30分,服务/应用程序在下午2点02分(美国东部时间)执行,我的toast消息正在不断执行,并且正在倒计时告诉我剩下多少时间...在这种情况下2:28并且正在减少......理想情况下,这应该不会显示,直到2:28结束......任何想法?
答案 0 :(得分:0)
根据android doc:
使用固定费率执行时,将安排每次连续运行任务的开始时间,而不考虑上次运行的时间。如果延迟阻止计时器按时启动任务,这可能会导致一系列的聚合运行(一个紧接着一个启动)。
我认为这可能是原因,可能你需要考虑替代的“固定期限”