Handler.postDelay 较长时间的任务可能不执行的问题

最近有个功能需求,要做一个延时任务

当时图简单,就直接用Handler.postDelay做了

结果测试发现一旦延时任务比较长,就无法执行了

原因分析

翻看了一下Handler的源码,原来问题出在这里:

Handler.postDelay 较长时间的任务可能不执行的问题_第1张图片
Handler.sendMessageAtTime()
Handler.postDelay 较长时间的任务可能不执行的问题_第2张图片
SystemClock.uptimeMillis()

原来Handler的延迟是基于SystemClock.uptimeMillis()计算的

而SystemClock.uptimeMillis()则是活跃时间,如果设备休眠了,就不算时间了,延时执行自然就继续往后延了

替代方案:

  • Timer.schedule(),简单方便

  • AlarmManager ,让系统定时提醒你(如果要想精确提醒,需要更多设置,甚至可能需要用户允许自启动)

 AlarmManager alarmMgr;
      PendingIntent alarmIntent;
      alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
      Intent intent = new Intent(action);
      alarmIntent =
          PendingIntent.getBroadcast(
              context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
      alarmMgr.set(AlarmManager.RTC, realRTCtime, alarmIntent);

你可能感兴趣的:(Handler.postDelay 较长时间的任务可能不执行的问题)