碰到一个简单的需求:执行一个耗时任务,超过预设的最长时间后则取消这次任务,即在任务开始时设置一个定时器,超过指定时间后取消这次任务。前前后后换了三种方式:Handler
、Timer
以及AlarmManager
,在这里小结一下它们的用法与区别。
Handler
首先Handler
应该是最熟悉的也最常用的一种方式了,核心就是调用handler.postDelayed
、handler.sendMessageDelayed()
或者handler.sendEmptyMessageDelayed()
方法设置一个延迟时间,然后将消息发送到消息队列中。示例代码如下:
private static final long TIMEOUT_MILLS = 5 * 60 * 1000L;
public void scheduleTimeout(){
Handler handler = new Handler();
handler.postDelayed(() -> {
//timeout logic
...
}, TIMEOUT_MILLS);
}
public void cancel(){
handler.removeCallbacksAndMessages(null);
}
Timer
Timer
是Java
提供的一个计时器,其内部单独开启了一个线程来执行任务,且有一点需要注意就是Timer
调用了cancel
方法后,就无法再次添加task了。
private static final long TIMEOUT_MILLS = 5 * 60 * 1000L;
Timer timer = new Timer();
private TimerTask timeoutTask = new TimerTask() {
@Override
public void run() {
//timeout logic
}
};
public void scheduleTimeout(){
timer.schedule(timeoutTask,TIMEOUT_MILLS);
}
public void cancel(){
//timer cancel后不能再次调用schedule方法,需要重新创建,所以可以调用task.cancel方法取消任务
//timer.cancel();
timeoutTask.cancel();
}
AlarmManager
AlarmManager
是Android
提供的一个类,它可以实现在应用生命周期之外定时任务。我这里所使用的场景比较简单,就是上传超时的处理,超时的时候屏幕可以能已经熄灭了,如果使用Handler
或者Timer
可能超时任务不会被执行,而使用AlarmManager
超时后它会唤醒进程然后执行超时逻辑。使用示例如下:
private static final long TIMEOUT_MILLS = 5 * 60 * 1000L;
AlarmManager mAlarmManager = (AlarmManager) contenxt.getSystemService(Context.ALARM_SERVICE);
private PendingIntent sTimeoutPendingIntent;
public void scheduleTimeout(Context context){
Intent intent = new Intent("com.action.xxx");
intent.setClass(this, TimeoutService.class);
sTimeoutPendingIntent = PendingIntent.getService(context, 0, intent, 0);
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime() + TIMEOUT_MILLS, sTimeoutPendingIntent);
}
public void cancel(){
if (sTimeoutPendingIntent != null) {
mAlarmManager.cancel(sTimeoutPendingIntent);
}
}
AlarmManager
的主体内容还是蛮多的,这里只涉及到了一小部分,贴一下链接方便以后查看:设置重复闹铃时间
网友评论