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

Android 子線程操作 UI 的真相:onCreate 階段的特殊性

     編輯:程式設計綜合問答

現象

在 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,必定拋出異常。

最佳實踐

  • 任何耗時操作(網絡、IO、計算)必須在子線程。
  • 更新 UI **強制**切回主線程:runOnUiThread()、Handler、View.post()、LiveData、RxAndroid 等。
  • 不要僥倖依賴「當前能跑通」,釋放版本必會崩潰。

Android UI 線程模型:單線程模型 + 消息隊列,子線程操作 UI 屬於未定義行為,務必遵守規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved