Serialize
Serialize copied to clipboard
serialLiveData在子线程获取value时异常
java.lang.IllegalStateException: Cannot invoke setValue on a background thread at androidx.lifecycle.LiveData.assertMainThread(LiveData.java:487) at androidx.lifecycle.LiveData.setValue(LiveData.java:306) at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50) at com.drake.serialize.serialize.SerializeLiveDataDelegate.getValue(SerializeDelegate.kt:149) at com.drake.serialize.serialize.SerializeLiveDataDelegate.getValue(SerializeDelegate.kt:117)
是在子线程.observer
还是.value
可以的话希望你可以fork仓库复现问题然后通知我, 更快速解决问题
在协程Dispatchers.IO中getValue时发生的异常。具体在SerializeDelegate.kt的149行,在这里似乎是判断livedata跟本地磁盘的数据是否一致,不一致就把livedata的value跟本地磁盘同步
serialLiveData
这是一个创建委托属性的方法, 你在子线程中创建?
我在demo中无法复现你的问题, 请你fork仓库复现问题
serialLiveData
好奇怪,我没办法在fork仓库复现,弄了好久,很奇怪的问题。。
我是怀疑你在子线程创建的对象, 然后对象中的serialLiveData
也属于子线程创建可能导致该问题
我也碰到这个问题了
我是在okhttp 拦截器里面 使用了 .value ,对象是放在了 一个 object class 里面
然后我在请求前 先 tokenResBean.value = null
设为空 ,就好了,但我正常 退出登录,把 tokenResBean.value = null
再删了 又不报错了,多试几次···又报错了···尴尬··
摸不清规律 ,看样子是 149行 和 前面的判断
我努力复现
我是怀疑你在子线程创建的对象, 然后对象中的
serialLiveData
也属于子线程创建可能导致该问题
我把 tokenResBean.value 在主线程 先获取一下 就行了··
最新版本修复此问题