Serialize icon indicating copy to clipboard operation
Serialize copied to clipboard

serialLiveData在子线程获取value时异常

Open ZXHHYJ opened this issue 2 years ago • 5 comments

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)

ZXHHYJ avatar Jun 07 '22 03:06 ZXHHYJ

是在子线程.observer还是.value

可以的话希望你可以fork仓库复现问题然后通知我, 更快速解决问题

liangjingkanji avatar Jun 07 '22 03:06 liangjingkanji

在协程Dispatchers.IO中getValue时发生的异常。具体在SerializeDelegate.kt的149行,在这里似乎是判断livedata跟本地磁盘的数据是否一致,不一致就把livedata的value跟本地磁盘同步

ZXHHYJ avatar Jun 07 '22 04:06 ZXHHYJ

serialLiveData这是一个创建委托属性的方法, 你在子线程中创建?

我在demo中无法复现你的问题, 请你fork仓库复现问题

liangjingkanji avatar Jun 07 '22 06:06 liangjingkanji

serialLiveData好奇怪,我没办法在fork仓库复现,弄了好久,很奇怪的问题。。

ZXHHYJ avatar Jun 14 '22 16:06 ZXHHYJ

我是怀疑你在子线程创建的对象, 然后对象中的serialLiveData也属于子线程创建可能导致该问题

liangjingkanji avatar Jun 14 '22 19:06 liangjingkanji

我也碰到这个问题了 我是在okhttp 拦截器里面 使用了 .value ,对象是放在了 一个 object class 里面
然后我在请求前 先 tokenResBean.value = null 设为空 ,就好了,但我正常 退出登录,把 tokenResBean.value = null 再删了 又不报错了,多试几次···又报错了···尴尬··

摸不清规律 ,看样子是 149行 和 前面的判断

我努力复现

我是怀疑你在子线程创建的对象, 然后对象中的serialLiveData也属于子线程创建可能导致该问题

594238813 avatar Jan 12 '23 09:01 594238813

我把 tokenResBean.value 在主线程 先获取一下 就行了··

594238813 avatar Jan 17 '23 06:01 594238813

最新版本修复此问题

liangjingkanji avatar Jan 26 '23 03:01 liangjingkanji