Android 延时执行的方法
方法一:使用 Handler
1、Handler.postDelayed()
在 Android 中子线程与主线程通过 Handler 来进行通信。子线程可以通过 Handler 来通知主线程进行UI更新,且不会阻塞主线程。
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 更新 UI 等操作
... ...
}
}, 3000);
2、Handler.sendEmptyMessage()
final int MSG_WHAT = 1;
Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
switch(message.what) {
case MSG_WHAT:
// 更新UI
... ...
break;
}
}
};
// 延时3s执行MSG_WHAT
handler.sendEmptyMessageDelayed(MSG_WHAT, 3000);
方法二:使用 Thread
Thread.sleep() 方法会使当前线程阻塞,建议创建新线程做延时操作。
new Thread() {
@Override
public void run() {
Thread.sleep(3000);
// 3s后会执行的操作
}
}.start();
方法三、使用 Timer 和 TimerTask
可通过 Timer 类定时来调度 TimerTask 任务。
TimerTask task = new TimerTask() {
@Override
public void run() {
// 要执行的操作
}
};
Timer timer = new Timer();
timer.schedule(task, 3000); // 延时3s 执行TimeTask的run方法
方法四:使用 AlarmManager.setRepeating()
AlarmManager 实质是一个全局的定时器,是 Android 中经常使用的一种系统级别的提示服务,在指定时间或周期性启动其他组件(如 Activity, Service, BroadcastReceiver)。
此方法适合需要一直在后台运行的定时任务。
如:设置闹钟去启动 MyIntentService 服务,每隔1分钟执行一次。
Intent intent = new Intent(context, MyIntentService.class);
intent.setAction(MyIntentService.ACTION_TEST);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, // 使用手机系统设置的时间
System.currentTimeMillis(), // 表示任务首次执行的时间
60*1000, // 1min后再次执行任务
pendingIntent);
public static class MyIntentService extends IntentService {
protected static final String ACTION_TEST= "action_test";
public MyIntentService () {
super("MyIntentService ");
}
@Override
protected void onHandleIntent(Intent intent) {
String action = intent.getAction();
switch (action) {
case ACTION_TEST:
... ...
break;
}
}
}
方法五、使用 Java 中的 ScheduledExecutorService 方法
Java 提供了 ScheduledExecutorService 类来进行延时执行。这种方式更为灵活。使用 ScheduledExecutorService 类可以延时执行某个任务,也可以反复执行某个任务。使用 ScheduledExecutorService 类可以使用 schedule() 方法来实现延时执行,如下所示:
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1);
scheduledExecutor.schedule(new Runnable() {
@Override
public void run() {
// 需要进行延时执行的操作
}
}, delayMillis, TimeUnit.MILLISECONDS);
其中,Runnable 对象就是将要执行的操作,delayMillis 参数是延时的毫秒数,TimeUnit 参数是延时的时间单位。需要注意的是,ScheduledExecutorService 类也是与线程无关的机制,因此可以在任意线程上进行延时执行。
注意事项
在使用Handler或Timer实现任务延时执行时,需要注意以下几点:
- 由于使用了定时器,应该在适当的时候停止定时器,以避免资源的浪费。
- 在使用Handler时,应该注意与UI线程的交互,避免发生主线程阻塞或内存泄漏等问题。
- 在使用Timer时,应该注意多线程问题,并避免线程安全问题。
- 以上就是本文介绍的如何在Android中实现任务延时执行的方法,你可以根据自己的实际需求来选择使用哪一种方法。