TimerTask tt = new TimerTask() {
public void run() {
Message msg = new Message();
msg.what = 0x123;
mHandler.handleMessage(msg); // 錯誤:在 Timer 執行緒直接呼叫 handleMessage
}
};
handleMessage 直接執行 UI 更新代碼,但 TimerTask.run() 在背景執行緒,導致 CalledFromWrongThreadException。
TimerTask tt = new TimerTask() {
public void run() {
mHandler.sendEmptyMessage(0x123); // 將訊息送入主執行緒訊息隊列
}
};
// Handler 定義在主執行緒(Activity onCreate)
Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
// 此處安全更新 UI
one.setImageResource(...);
}
};
| 方法 | 執行執行緒 | 用途 |
|---|---|---|
sendMessage / sendEmptyMessage | 呼叫者執行緒(非阻塞) | 將訊息加入目標 Looper 隊列 |
handleMessage | Looper 所屬執行緒(主執行緒) | 處理訊息的回調,不可直接呼叫 |