LiveData: проблема с очередностью или задержкой или асинхронностью
У меня возник странный баг и я не могу понять в чем проблема.
Суть кода:
у меня есть 2 LiveData.
1 - для данных из инета. либо они есть, либо они null.
2 - Boolean статус работы. true - при начале работы. 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
игрался с разными Dispatchers - разницы нет.
словно строчка loadFlag.postValue(null) выполняется асинхронно от остального.
не могу понять, где моя ошибка или что я упускаю
Ответы (1 шт):
Ну так и есть. Метод postValue() работает из фонового потока, поэтому и значение приходит туда так сказать с задержкой. Можете использовать setValue(), работающее как раз из основного потока, тогда все активные наблюдатели мгновенно получат новое значение. За всеми подробностями милости прошу в документацию : https://developer.android.com/reference/androidx/lifecycle/LiveData#postValue(T)