定时任务的几种实现方式

Android里有时需要定时循环执行某段代码,或者需要在某个时间点执行某段代码,这个需求大家第一时间会想到Timer对象,没错,不过我们还有更好的选择。

一、Timer 实现定时任务
Timer timer;
void onCreate(){
……
TimerTask task = new TimerTask(){
public void run(){
// 在此处添加执行的代码
}
};
timer = new Timer();
timer.schedule(task, 1000);//开启定时器,delay 1s后执行task
}
void onDestroy(){
……
timer.cancel();//销毁定时器
}

二、Handler实现定时任务
1.隔一段时间后执行某个操作,循环执行:
void onCreate(){
……
Handler handler = new Handler();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
// 在此处添加执行的代码

         handler.postDelayed(this, 50);// 50ms后执行this,即runable  
     }   
 };   
 handler.postDelayed(runnable, 50);// 打开定时器,50ms后执行runnable操作  

}
void onDestroy(){
……
handler.removeCallbacks(this);// 关闭定时器处理
}
2.隔一段时间后执行某个操作一次,执行完后,不再执行:
void onCreate(){
……
Handler handler = new Handler();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
// 在此处添加执行的代码
doSomeThing();
handler.removeCallbacks(this); //移除定时任务
}
};
handler.postDelayed(runnable, 50);// 打开定时器,50ms后执行runnable
}

三、AlarmManager实现精确定时操作
我们使用Timer或者handler的时候会发现,delay时间并没有那么准。如果我们需要一个严格准时的定时操作,那么就要用到AlarmManager,AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.
下面的代码详细的介绍了两种定时方式的使用:
(1)在指定时长后执行某项操作
// 以下的代码是<<足球即时比分>>中的代码片段.
public static AlarmManagerUtil{
public static AlarmManager getAlarmManager(Context ctx){
return (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
}

/**
 * 指定时间后进行更新赛事信息(有如闹钟的设置)
 * 注意: Receiver记得在manifest.xml中注册
     * 
 * @param ctx
 */
public static void sendUpdateBroadcast(Context ctx){
    Log.i("score", "send to start update broadcase,delay time :"+60000);

    larmManager am = getAlarmManager(ctx);
        // 60秒后将产生广播,触发UpdateReceiver的执行,这个方法才是真正的更新数据的操作主要代码
    Intent i = new Intent(ctx, UpdateReceiver.class); 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
    am.set(AlarmManager.RTC, System.currentTimeMillis()+60000, pendingIntent);
}

/**
 * 取消定时执行(有如闹钟的取消)
 * 
 * @param ctx
 */       
public static void cancelUpdateBroadcast(Context ctx){
    AlarmManager am = getAlarmManager(ctx);
    Intent i = new Intent(ctx, UpdateReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
    am.cancel(pendingIntent);
}

}

// 更新数据库的广播接收器
public static class UpdateReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, “更新比分数据”, Toast.LENGTH_LONG).show();

         // 设置全局定时器(闹钟) 60秒后再发广播通知本广播接收器触发执行.
         // 这种方式很像JavaScript中的 setTimeout(xxx,60000)
         AlarmManagerUtil.sendUpdateBroadcast(context);
    }
}

(2)周期性的执行某项操作
public static void sendUpdateBroadcastRepeat(Context ctx){
Intent intent =new Intent(ctx, UpdateReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0);

//开始时间
long firstime=SystemClock.elapsedRealtime();

AlarmManager am = (AlarmManager) ctx.getSystemService(ALARM_SERVICE);

  //60秒一个周期,不停的发送广播
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstime, 60*1000, pendingIntent);
}
取消定时器(闹钟)
/**
* 取消定时执行(有如闹钟的取消)
*
* @param ctx
*/
public static void cancelUpdateBroadcast(Context ctx){
AlarmManager am = getAlarmManager(ctx);
// 取消时注意UpdateReceiver.class必须与设置时一致,这样才要正确取消
Intent i = new Intent(ctx, UpdateReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0);
am.cancel(pendingIntent);
}
}

### 回答1: 答:Java实现定时任务方式有三种:1.使用java.util.Timer类;2.使用java.util.concurrent.ScheduledThreadPoolExecutor类;3.使用Quartz框架。 ### 回答2: Java实现定时任务有以下几种方式: 1. Timer类:Java提供了Timer类来帮助实现定时任务。通过创建一个Timer实例和一个TimerTask实例,可以设定任务的执行时间和间隔时间,然后使用Timer的schedule()方法来启动任务。 2. ScheduledExecutorService接口:Java提供了ScheduledExecutorService接口来实现定时任务。该接口继承自ExecutorService接口,可以使用ThreadPoolExecutor来实现。通过调用schedule()方法,可以设定任务的执行时间和间隔时间,然后将任务提交给ScheduledExecutorService。 3. cron表达式:在Java中,还可以使用cron表达式来实现定时任务。cron表达式是一种用来设置时间的字符串格式,通过设置不同的字段,可以实现精确到秒的定时任务。可以使用Quartz框架等工具来解析和执行cron表达式。 4. Spring框架的@Scheduled注解:如果在Spring框架中开发应用,可以使用@Scheduled注解来实现定时任务。通过在方法上标记@Scheduled注解,并设置相应的时间表达式,可以让方法在指定的时间间隔内执行。 需要注意的是,以上方式都是基于Java的定时任务实现,可以根据具体需求选择最合适的方式实现定时任务。 ### 回答3: 在Java中,我们可以使用以下几种方式实现定时任务。 1. Timer类:Java中的Timer类是一个简单的定时器工具,它可以通过创建Timer对象并调用其schedule()方法来设置定时任务。该方法可以指定一个任务(实现TimerTask接口的类)和一个延迟时间,然后在延迟时间之后开始执行定时任务。 2. ScheduledExecutorService接口:Java中的ScheduledExecutorService接口是一个在指定的延迟时间之后或者以固定的时间间隔重复执行任务的调度器。可以使用Executors工厂类的newScheduledThreadPool()方法创建ScheduledExecutorService对象,并使用其schedule()方法来设置定时任务。 3. Quartz框架:Quartz是一个功能强大且灵活的开源定时任务调度框架。它提供了许多高级的调度功能,如任务的并发执行、动态调度、集群支持等。使用Quartz框架,我们可以通过配置定时任务的详细信息(如触发器、调度器等),然后让框架来管理和执行定时任务。 4. Spring的Task:Spring框架提供了一个简单的任务调度器,可以通过配置的方式实现定时任务。在Spring的配置文件中,我们可以使用<task:scheduler>和<task:scheduled>标签来定义定时任务的调度器和具体的定时任务方法。 综上所述,Java实现定时任务方式有多种选择。根据需求的复杂性和灵活性的要求,我们可以选择适合的方式实现定时任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值