liangjingkanji / Serialize

🍒 Android 简单高性能读写本地数据, 直接存储对象/基础类型
http://liangjingkanji.github.io/Serialize/
Apache License 2.0
239 stars 20 forks source link

serialLiveData在子线程获取value时异常 #13

Closed ZXHHYJ closed 1 year ago

ZXHHYJ commented 2 years ago

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)

liangjingkanji commented 2 years ago

是在子线程.observer还是.value

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

ZXHHYJ commented 2 years ago

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

liangjingkanji commented 2 years ago

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

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

ZXHHYJ commented 2 years ago

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

liangjingkanji commented 2 years ago

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

594238813 commented 1 year ago

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

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

我努力复现

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

594238813 commented 1 year ago

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

liangjingkanji commented 1 year ago

最新版本修复此问题