Я пытаюсь показать счетчик при выполнении сетевого вызова с использованием сопрограмм.Кажется, что пользовательский интерфейс не показывает состояние LOADING_ITEMS (счетчик) до тех пор, пока не будет возвращен вызов itemsFromRepo, затем в течение доли секунды отображается счетчик, а затем отображаются элементы.У меня сложилось впечатление, что, как и в сопрограмме, состояние будет установлено на LOADING_ITEMS, элементы будут очищены, сетевой вызов будет выполнен в фоновом режиме, пока счетчик отображается в пользовательском интерфейсе.Затем, когда сетевой вызов завершится, сопрограмма продолжит работу и установит элементы, затем установит состояние.
Это правильный способ использования сопрограмм?И масштаб, я думаю, это новое из экспериментальных сопрограмм, с которыми я играл несколько месяцев назад.
// ViewModel.kt
enum class State { LOADING_ITEMS, SELECTING_ITEM }
var state = ObservableField<State>()
var items = ObservableField<List<String>>()
private fun loadItems() {
state.set(State.LOADING_ITEMS)
items.set(emptyList())
GlobalScope.launch(Dispatchers.Main) {
val itemsFromRepo = apiRepo.getItems() // a network call
items.set(itemsFromRepo)
state.set(State.SELECTING_ITEM)
}
}
// Repo.kt
suspend fun getItems() = suspendCoroutine<List<String>> { cont ->
FirebaseDatabase.getInstance().getReference("Items")
.addListenerForSingleValueEvent(
object : ValueEventListener {
override fun onCancelled(error: DatabaseError?) {
cont.resume(listOf(error?.message ?: "Unknown error"))
}
override fun onDataChange(snap: DataSnapshot?) {
cont.resume(snap?.children?.map { it.key } ?: emptyList())
}
})
}