12. 常见陷阱
❌ 主线程做 IO
网络/数据库没包 withContext(Dispatchers.IO),直接卡 UI。记得切线程。
❌ 在 suspend 里用 runBlocking
会阻塞当前线程,违背协程初衷。需要桥接时只在 main/测试用。
❌ 忘记处理 async 异常
async 异常延迟到 await(),不 await 就静默丢失。要么 await 要么 try/catch。
❌ GlobalScope 内存泄漏
用 viewModelScope / lifecycleScope 代替,自动随生命周期取消。
阻塞检测:开启 kotlinx-coroutines-debug 或在测试中用 Dispatchers.setMain + runTest 能快速发现「主线程上的阻塞调用」。