学而实习之 不亦乐乎

Android 延时执行的方法

2023-11-23 20:54:44

方法一:使用 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中实现任务延时执行的方法,你可以根据自己的实际需求来选择使用哪一种方法。