錯誤現象
提示 "The application may be doing too much work on its main thread",但視頻教程與源碼運行正常,懷疑 API 版本差異。
本質解析
- 主線程(UI 線程):負責繪製界面、分發觸摸事件、運行 `Handler` 消息循環。若被耗時操作(網絡、IO、複雜計算)阻塞超過 5 秒,系統拋出 ANR(Application Not Responding)。
- 異步任務:將耗時操作移至子線程(如 `Thread`、`AsyncTask`、协程、RxJava),完成後通過 `Handler`/`runOnUiThread` 回主線程更新 UI。
- 時間片輪轉:CPU 以極短時間片(毫秒級)在多線程間切換,宏觀上呈現「並行」效果。
版本差異影響
Android 版本升級會收緊主線程檢測閾值、限制隱式廣播、強制要求網絡請求在子線程。教程源碼可能針對舊版本優化,或隱式依賴特定設備性能。建議:
- 使用 `StrictMode` 開發期檢測主線程違規。
- 統一遷移至 Kotlin 協程或 `ExecutorService` + `LiveData` 現代架構。
- 檢查 `build.gradle` 中 `minSdkVersion`/`targetSdkVersion` 設置。
核心原則
主線程只做 UI 相關工作,所有阻塞操作必須異步化。
Android 主線程 ANR 原理,異步任務必要性,版本差異導致行為不一致,協程現代化方案。