【发布时间】:2019-01-01 09:39:27
【问题描述】:
我试图在使用协程进行网络调用时显示微调器。 UI 似乎不显示 LOADING_ITEMS 状态(微调器),直到 itemsFromRepo 调用返回,然后微调器显示片刻,然后显示项目。我的印象是,在协程中,状态将设置为 LOADING_ITEMS,项目将被清除,网络调用将在后台进行,同时微调器显示在 UI 上。然后当网络调用完成后,协程将继续运行并设置项目然后状态。
这是使用协程的正确方法吗?还有范围,我认为这是我几个月前玩过的实验性协程的新内容。
// 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())
}
})
}
【问题讨论】:
标签: android kotlin kotlin-coroutines