昨天晚上在寫一個Android的計時器,開始認為很容易,用Java一般寫法,結果發現計時器根本不能運行,但卻不報任何錯誤,當時就呆在那了,不知道該怎麼辦了,後來在網上查了一下,Android考慮到安全執行緒問題,不允許線上程中執行UI線程(我的現在所知道,還有其他的限制發現中),在Android中,有一個很有意思的類:android.os.Handler,這個可以實現各處線程間的訊息傳遞。
先看段代碼,這個執行個體化了一個Handler,Handler可以通過Message在多個線程通訊,我這裡做的是定時recLen加1,然後以一定的格式,顯示到recTime上(UI線程上的操作)。Code
1 final Handler handler = new Handler(){
2 public void handleMessage(Message msg) {
3 switch (msg.what) {
4 case 1:
5 recLen++;
6 recTime.setText(GetRecTime(recLen));
7 break;
8 }
9 super.handleMessage(msg);
10 }
11 };
下面定執行個體化一個TimerTask,這個是為Timer提供一個定時執行的內容。我在這個方法中加的是給Handler一個發送訊息功能,因這在Timer的線程中,無法直接操作UI線程。1 TimerTask task = new TimerTask(){
2 public void run() {
3 Message message = new Message();
4 message.what = 1;
5 handler.sendMessage(message);
6 }
7 };
剩下的工作就簡單多,添加一個Timer,可以讓程式運行起來了1 timer = new Timer(true);
2 timer.schedule(task,1000, 1000); //延時1000ms後執行,1000ms執行一次
3 //timer.cancel(); //退出計時器
說到這裡,也許有些還感覺雲裡霧裡,好久沒寫東西,也不知道怎麼把問題說的更明白,這個再貼上我開始的錯誤寫法,對比錯誤寫法,也許能讓大家更快的明白過來錯誤寫法
1TimerTask task = new TimerTask(){
2 public void run() {
3 recLen++;
4 recTime.setText(GetRecTime(recLen));//直接在TimerTask中操作UI線程,單步調試的時候發現,程式根本就沒執行到這裡
5 }
6};
7timer = new Timer(true);
8timer.schedule(task,1000, 1000);
註:本人也是Android初學者,說的不對的地方歡迎各位指正,很想在這裡和大家多多交流,一個學習的過程遇到問題的時候感覺真的很無助。