Android实现定时任务

碰到一个简单的需求:执行一个耗时任务,超过预设的最长时间后则取消这次任务,即在任务开始时设置一个定时器,超过指定时间后取消这次任务。前前后后换了三种方式:HandlerTimer以及AlarmManager,在这里小结一下它们的用法与区别。

Handler

首先Handler应该是最熟悉的也最常用的一种方式了,核心就是调用handler.postDelayedhandler.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

TimerJava提供的一个计时器,其内部单独开启了一个线程来执行任务,且有一点需要注意就是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

AlarmManagerAndroid提供的一个类,它可以实现在应用生命周期之外定时任务。我这里所使用的场景比较简单,就是上传超时的处理,超时的时候屏幕可以能已经熄灭了,如果使用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的主体内容还是蛮多的,这里只涉及到了一小部分,贴一下链接方便以后查看:设置重复闹铃时间

你可能感兴趣的:(Android实现定时任务)