最近有个功能需求,要做一个延时任务
当时图简单,就直接用Handler.postDelay做了
结果测试发现一旦延时任务比较长,就无法执行了
原因分析
翻看了一下Handler的源码,原来问题出在这里:
原来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);