20
Июл
2021

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) 
        [email protected] ret 
} 

Проблема в строчке if (ret == null) loadFlag.postValue(null)
я вижу в логах, что приходит ret и правда пришел null, а вот флаг loadFlag не меняется. он становится false.
если я поставлю задержку хотя бы в 1 мс - то все будет работать как надо.

 if (ret == null) loadFlag.postValue(null) 
  delay(1) 
  [email protected] ret 

игрался с разными Dispatchers - разницы нет.
словно строчка loadFlag.postValue(null) выполняется асинхронно от остального.
не могу понять, где моя ошибка или что я упускаю

Источник: https://ru.stackoverflow.com/questions/1306915/livedata-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%BE%D1%87%D0%B5%D1%80%D0%B5%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E-%D0%B8%D0%BB%D0%B8-%D0%B7%D0%B0%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%BE%D0%B9-%D0%B8%D0%BB%D0%B8-%D0%B0%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E

Тебе может это понравится...

Добавить комментарий