【Android】之【延时执行的几种方法】

在Android日常开发中我们经常会有延时执行某个操作的需求,例如我们启动应用的时候,开始呈现一个引导页面,过了两三秒后,自动跳转到主界面;又如为了控制时序,需要延时执行等等。

下面整理下实现延时执行操作的几种方法:

① 使用Handler的postDelayed方法实现延时操作

推荐使用这种方式

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    
    
    @Override
    public void run() {
    
    
       /**
        *要执行的操作
        */
    }
}, 3000);//3秒后执行Runnable中的run方法
new Handler().postDelayed(new Runnable() {
    
    
public void run() {
    
    
	//要执行的任务
}}, 3000);
 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);

② 使用线程的休眠实现延时操作

new Thread() {
    
    
    @Override
    public void run() {
    
    
        super.run();
        Thread.sleep(3000);//休眠3秒
        /**
         * 要执行的操作
         */
    }
}.start();

③ 使用Timer定时器

 TimerTask task = new TimerTask() {
    
    
   @Override
     public void run() {
    
    
       // 要执行的操作
     }
 };
 Timer timer = new Timer();
 timer.schedule(task, 3000); // 延时3s 执行TimeTask的run方法
 
 timer.schedule(task,3000,5000);//3秒后每隔5秒执行一次
 timer.cancel();//销毁

④ AlarmManager.setRepeating()

适合需要一直在后台运行的定时任务,比如每隔5分钟就做一件事。


/**
 * 一个定时任务
 */
public class AlarmService extends Service {
    
    
    private static final int INTERVAL = 1 * 60 * 60 * 1000;//1小时
    private static final int PENDING_REQUEST = 0;

    /**
     * 调用Service都会执行到该方法
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
    

        //通过AlarmManager定时启动广播
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        long triggerAtTime = SystemClock.elapsedRealtime() + INTERVAL;//从开机到现在的毫秒(手机睡眠(sleep)的时间也包括在内

        Intent i = new Intent(this, AlarmReceive.class);
        PendingIntent pIntent = PendingIntent.getBroadcast(this, PENDING_REQUEST, i, PENDING_REQUEST);
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pIntent);

        return super.onStartCommand(intent, flags, startId);
    }

}
public class AlarmReceive extends BroadcastReceiver {
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        Intent i = new Intent(context, AlarmService.class);
        context.startService(i);
    }
}

猜你喜欢

转载自blog.csdn.net/daokedream/article/details/129625259