整理常见的延时处理方法,作为记录。
1、Handler.postDelayed()
适合在主线程更新UI操作,不会阻塞线程
Handler handler = new Handler(); // 如果这个handler是在UI线程中创建的
handler.postDelayed(new Runnable() { // 开启的runnable也会在这个handler所依附线程中运行,即主线程
@Override
public void run() {
// 可更新UI或做其他事情
// 注意这里还在当前线程,没有开启新的线程
// new Runnable(){},只是把Runnable对象以Message形式post到UI线程里的Looper中执行,并没有新开线程。
}
}, 3000); // 延时3s执行run内代码
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);
3、Thread.sleep()
Thread.sleep()会使当前线程阻塞,建议创建新线程做延时操作
new Thread() {
@Override
public void run() {
Thread.sleep(3000);
// 3s后会执行的操作
}
}.start();
4、TimerTask
TimerTask task = new TimerTask() {
@Override
public void run() {
// 要执行的操作
}
};
Timer timer = new Timer();
timer.schedule(task, 3000); // 延时3s 执行TimeTask的run方法
5、AlarmManager.setRepeating()
适合需要一直在后台运行的定时任务,比如每隔5分钟就做一件事,在应用保活情况下,延时是精准的。
概念:
Intent是立刻执行的, PendingIntent不是立刻执行的。
getBroadcast(Context, int, Intent, int) 发送一个广播组件
getService(Context, int, Intent, int) 启动一个服务组件
代码释义:从当前时间开始设置闹钟去启动TestIntentService服务,执行其action为ACTION_TEST的内容,设定每隔1分钟执行一次。
Intent intent = new Intent(context, TestIntentService.class);
intent.setAction(TestIntentService.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 TestIntentService extends IntentService {
protected static final String ACTION_TEST= "action_test";
public TestIntentService () {
super("TestIntentService ");
}
@Override
protected void onHandleIntent(Intent intent) {
String action = intent.getAction();
switch (action) {
case ACTION_TEST:
...
break;
}
}
}
版权归原作者 Joesacsdn 所有, 如有侵权,请联系我们删除。