我有一个奇怪的错误,我无法弄清楚问题是什么。
代码的要点:
我有 2 LiveData
。
1 - 来自互联网的数据。要么他们是,要么他们是null
。
2 -Boolean
工作状态。真实 - 在工作开始时。false
- 成功完成后。null
——如果资料太来自网上null
。
suspend fun getGms(platform: String, nickName: String) = withContext(Dispatchers.Default) {
loadFlag.postValue(true)
gmsInet.postValue(getGmsFromInet(platform, nickName))
if (loadFlag.value != null) loadFlag.postValue(false)
}
private suspend fun getGmsFromInet(platform: String, nickName: String): _GamerStats? = withContext(Dispatchers.IO) {
val ret: _GamerStats? = remoteModel.getGmsFromInet(platform, nickName)
if (ret == null) loadFlag.postValue(null)
return@withContext ret
}
问题出在这条线上, if (ret == null) loadFlag.postValue(null)
我在日志中看到它来ret
了,真相来了null
,但标志loadFlag
没有改变。它变成false
.
如果我至少延迟1 мс
- 那么一切都会正常进行。
if (ret == null) loadFlag.postValue(null)
delay(1)
return@withContext ret
与不同的调度员一起玩 - 没有区别。
就好像该行loadFlag.postValue(null)
与其余行异步执行一样。
无法弄清楚我的错误在哪里或我错过了什么
嗯,是的。postValue() 方法在后台线程中工作,因此可以说值会延迟到达那里。您可以使用仅在主线程中工作的 setValue() ,然后所有活动的观察者将立即收到新值。有关所有详细信息,欢迎阅读文档:https://developer.android.com/reference/androidx/lifecycle/LiveData#postValue(T)