2012年6月22日 星期五

Android程式設計 - 使用Timer物件


Timer物件其計時單位為毫秒,而且可直接設定執行程序的間隔時間,在應用上比Chronmeter更具彈性。

首先必須建立Timer物件:
Timer tm = new Timer();

之後使用schedule()方法設定固定時間要進行的時間作業程序。
void schedule (TimerTask task, long delay, long period)
task 定時要執行之TimerTask。
delay 多少時間後才開始執行TimerTask,單位是毫秒。
period 每隔多少時間執行TimerTask一次,單位是毫秒。

TimerTask物件必須實作run方法,也是你想要定時去執行的作業。由於TimerTask與目前作業中的Activity是二個不同的執行緒,因此在TimerTask不能直接更新Activity的介面元件內容,而必須透過Handler物件來傳遞Message物件給Activity,在Activity中再處理Handler所收到的訊息。Activity程式中必須實作其handleMessage()方法來處理Handler內的訊息。

由於TimerTask與程式Activity時是不同的執行緒,在結束程式前記得要調用cancel()方法終止TimerTask作業。


public class MainActivity extends Activity {
    @Override
    protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
tmTask.cancel();
    }

    private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what){
case 1:
Toast.makeText(MainActivity.this, "Timer Task", Toast.LENGTH_SHORT).show();
break;
default:
}
    }};

    private TimerTask tmTask = new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}};

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);       
        Timer tm = new Timer();
tm.schedule(tmTask, 10000, 3000);
    }
}