首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android Handler 更新 UI 執行緒錯誤:sendMessage vs handleMessage

     編輯:程式設計綜合問答

錯誤代碼

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(...);
    }
};

關鍵差異

現代替代方案

  • View.post(Runnable) / View.postDelayed
  • runOnUiThread(Runnable)
  • Kotlin 協程:withContext(Dispatchers.Main) { ... }
  • RxJava:observeOn(AndroidSchedulers.mainThread())
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法執行執行緒用途
sendMessage / sendEmptyMessage呼叫者執行緒(非阻塞)將訊息加入目標 Looper 隊列
handleMessageLooper 所屬執行緒(主執行緒)處理訊息的回調,不可直接呼叫