Translate

2010年12月29日 星期三

99-1朝陽資工 - 手持式裝置程式設計 - Android Thread

Android 的UI運作方式與Java Swing不同,
它使用的是單一Thread運作方式,意思就是UI前端只有一個Thread (ex View),
其餘都在背景執行,而背景執行的thread若要用到前景Thread的事件或方法,

則會產生錯誤事件:CalledFromWrongThreadException


那Android背景事件該如何使用前景呢,
舉例來說若我們啟動了一個Timer,它便會於背景執行,
但若在Timer的 TimerTask中我們想要讓他啟動一個動作(如Toast)
這時若以傳統Java Swing的方式執行是沒問題的,


但若在Android執行,則無法顯示結果,
那該怎麼辦呢?


事實上Android提供了一個類別用來讓背景Thread使用前景的物件,
這個類別便是 Handler ,詳見:Android Handler Doc


接續上述的例子,
我們便可以透過Handler的message 傳送,來達到操作前景Thread的效果囉。




final Handler handler = new Handler(){
       public void handleMessage(Message msg) {  
           switch (msg.what) {      
           case 1:      
            Toast toast = Toast.makeText(getApplicationContext(), "SHOW)", Toast.LENGTH_SHORT);
toast.show();
break;      
           }      
           super.handleMessage(msg);  
       }  
   };  
   
timer = new Timer();
TimerTask timerTask = new TimerTask() {
public void run() {
           Message message = new Message();      
           message.what = 1;      
           handler.sendMessage(message);
}
};

//設定Alarm time,且Time out時會執行timerTask送出信息
timer.schedule(timerTask, 3000, 3000);




BP



沒有留言: