在 onCreate() 中新建 Thread 直接 bt.setText("haha") 竟然成功,未拋出 CalledFromWrongThreadException。
ViewRootImpl 未創建。ViewRootImpl(負責檢查線程合法性的 checkThread())是在 onResume() 階段隨窗口添加時創建的。onCreate() 結束前,視圖層級尚未附著到窗口,故無線程檢查。
new Thread(() -> {
try { Thread.sleep(2000); } // 延遲 2 秒,讓 Activity 進入 Resumed 狀態
catch (InterruptedException e) { e.printStackTrace(); }
runOnUiThread(() -> bt.setText("haha")); // 必須切回主線程
}).start();
加上 sleep(2000) 後再操作 UI,必定拋出異常。
runOnUiThread()、Handler、View.post()、LiveData、RxAndroid 等。Android UI 線程模型:單線程模型 + 消息隊列,子線程操作 UI 屬於未定義行為,務必遵守規範。