后台线程里观察 LiveData 的崩溃,与“主线程同步桥“

📅 2026/8/26 15:34:28
后台线程里观察 LiveData 的崩溃,与“主线程同步桥“
一个构造函数在后台线程被调用,内部却调了observeForever,直接抛异常。解法不是改线程模型,而是用一个"主线程同步桥"——Handler + CountDownLatch——把那段必须跑在主线程的代码,从后台线程安全地"搬"过去。一、先看现象有一个崩溃,信息很明确:IllegalStateException: Cannot invoke observeForever on a background thread翻译成人话:observeForever只能在主线程调用,而你现在在后台线程调了它。于是问题变成两个:第一,为什么这段代码会在后台线程跑?第二,怎么在不推翻现有线程模型的前提下,把它安全地"搬"回主线程?二、场景与现象场景:一个 Android 业务应用,初始化时要用协程在Dispatchers.IO上做串口连接(因为连接本身是阻塞 IO,不该放主线程)。连接流程会构造一个设备门面对象,而这个门面对象的构造函数里,调了LiveData.observeForever(...)。链路大概是:初始化 initData() → 协程 Dispatchers.IO 启动 → c