天天看點

Android定時器的幾種實作方式

第一種方式利用Timer和TimerTask

1、繼承關系

java.util.Timer

基本方法 schedule

例如:

  1. timer.schedule(task, delay,period);   
  2. //delay為long,period為long:從現在起過delay毫秒以後,每隔period毫秒執行一次。   

schedule方法有三個參數

第一個參數就是TimerTask類型的對象,我們實作TimerTask的run()方法就是要周期執行的一個任務;

第二個參數有兩種類型,第一種是long類型,表示多長時間後開始執行,另一種是Date類型,表示從那個時間後開始執行;

第三個參數就是執行的周期,為long類型。

2、

  1. TimerTask  task= new TimerTask() {  
  2.          @Override  
  3.          public void run() {  
  4.                 count++;  
  5.                 Log.i("MainActivity",count + "");  
  6.          }  
  7. };  

//以下是幾種排程task的方法: 

  1. //time為Date類型:在指定時間執行一次。    
  2. timer.schedule(task, time);    
  3. //firstTime為Date類型,period為long,表示從firstTime時刻開始,每隔period毫秒執行一次。   
  4. timer.schedule(task, firstTime,period);       
  5. //delay 為long類型:從現在起過delay毫秒執行一次。    
  6. timer.schedule(task, delay);     
  7. //delay為long,period為long:從現在起過delay毫秒以後,每隔period毫秒執行一次。   
  8. timer.schedule(task, delay,period);   

注意:task應該在onDestory()中取消掉,否則可能發生崩潰 

3、用TimerTask定時進行某些操作的APP,即使退出了,TimerTask中依然會運作一會,但是不能長時間運作

第二種方式 使用CountDownTimer

1、Demo

  1. CountDownTimer cdt = new CountDownTimer(10000, 100) {  
  2.     @Override  
  3.     public void onTick(long millisUntilFinished) {  
  4.         tv_hello.setText(millisUntilFinished + "");  
  5.     }  
  6.     @Override  
  7.     public void onFinish() {  
  8.     }  
  9. };  
  10. cdt.start();  

2、上面的例子是

每隔100毫秒執行onTick中的方法一次

直到執行完10000/100次為止,最後會執行onFinish()中的方法

第三種方式 AlarmManager

demo:

  1. Intent intent2 = newIntent(ReadLogService.this,TestBroadcast.class);  
  2. PendingIntent pd =PendingIntent.getBroadcast(getApplicationContext(), 0, intent2,PendingIntent.FLAG_ONE_SHOT);  
  3. AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);  
  4. long triggerTime =SystemClock.elapsedRealtime() + 5*1000;  
  5. am.set(AlarmManager.ELAPSED_REALTIME,triggerTime, pd);  

第四種方式 Handler

  1. handler.sendEmptyMessageDelayed(0, 4000);//啟動handler,實作4秒定時循環執行  
  2. private Handler handler = new Handler(){  
  3. public voidhandleMessage(android.os.Message msg) {  
  4.            if(isChange){  
  5.                     //邏輯處理  
  6.                         handler.sendEmptyMessageDelayed(0,4000);//4秒後再次執行  
  7.             }  
  8.   }  
  9. };