天天看點

Android 中Timer和TimeTask完成定時任務

1. Timer 用法

[java]  view plain  copy

  1. new Timer().schedule(new TimerTask(){  
  2. @Override  
  3. public void run() {  
  4. // TODO Auto-generated method stub  
  5. // do some your own process when the timeout come up  
  6. }, delay, period);  

Timer作用:延時或循環執行。

使用帶period參數的schedule方法該timer以period為周期,循環執行run方法。--------循環執行。

使用不帶period參數的schedule方法則該timer隻在delay時間到來時執行一次。--------單次執行。

2. 注意

TimerTask運作在一個單獨的線程裡,而不是UI線程。是以使用Android timer時,注意android的單線程原則,確定線程安全。不要在TimerTask的run方法中做UI相關的操作,如:TextView.setText()等,這樣可能會導緻UI線程阻塞。如果需要可以使用handler向UI線程發消息,具體處理由UI線程自己完成。在使用完Timer之後,要使用Timer的cancel方法取消Timer,否則Timer一直在運作。

下面為執行個體示範:

1.Timer +TimerTask 

Timer timer = new Timer( );

TimerTask task = new TimerTask( ) {

public void run ( ) {

Message message = new Message( );

message.what = 1;

handler.sendMessage(message);

}

};

final Handler handler = new Handler( ) {

public void handleMessage(Message msg) {
switch (msg.what) {
case 1:

log.e("Timer","Timer");

break;

}

super.handleMessage(msg);

}

};

protected void onDestroy ( ) {

if (timer != null) {

timer.cancel( );

timer = null;

}

super.onDestroy( );

}

protected void onCreate (Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setContentView(R.layout.main);

timer.schedule(task,1000,5000);

}

需要注意的是 timer.schedule(task,1000,5000),如果設定為 timer.schedule(task,5000)是不會工作的。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2.Handler+Runnable

final Handler handler = new Handler( ) {

public void handleMessage(Message msg) {
switch (msg.what) {
case 1:

log.e("Timer","Timer");

break;

}

super.handleMessage(msg);

}

};

private Runnable runnable = new Runnable( ) {

public void run ( ) {

 Message message =  handler .obtainMessage( );

message.what = 1;

handler.sendMessage(message);

}

};

handler.postDelayed(runnable,1000);         // 開始Timer

handler.removeCallbacks(runnable);           //停止Timer