为什么 CallbackFlow 在主线程上是 运行
Why CallbackFlow is running on main thread
我在我的代码中使用回调流从 Firebase 数据库检索数据。这是我的代码
@ExperimentalCoroutinesApi
suspend fun getUserOrder() = callbackFlow<UserOrder>{
println("Current Thread name is ${Thread.currentThread().name}")
databaseReference.child("Order").addValueEventListener(object : ValueEventListener{
override fun onCancelled(error: DatabaseError) {
Log.d("database error ",error.message)
channel.close(error.toException())
}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()){
snapshot.children.forEach { data ->
data.children.forEach {newData->
newData.children.forEach { childData->
val userOrder = UserOrder(
childData.key!!,
childData.child("item_name").value as String,
childData.child("item_price").value as String,
childData.child("item_quantity").value as String,
childData.child("item_weight").value as String
)
offer(userOrder)
}
}
}
channel.close()
}
}
})
awaitClose()
}
//Activity class code
viewModel.viewModelScope.launch {
val time = measureTimeMillis {
viewModel.getOrder().collect {
println("Item id is ${it.item_id}")
}
}
println("Total time taken is $time")
}
正在检索数据,但它正在主线程上 运行ning。我想 运行 它在后台线程上。这怎么可能?。告诉我任何人
您使用“绑定到 Dispatchers.Main.immediate
”的 viewModelScope
启动了协程。
这就是你的协程在主线程中运行的原因。
要跳线程,可以使用withContext
。
IO
dispatcher 可用于线程阻塞调用,我在给定的代码中没有看到。
我在我的代码中使用回调流从 Firebase 数据库检索数据。这是我的代码
@ExperimentalCoroutinesApi
suspend fun getUserOrder() = callbackFlow<UserOrder>{
println("Current Thread name is ${Thread.currentThread().name}")
databaseReference.child("Order").addValueEventListener(object : ValueEventListener{
override fun onCancelled(error: DatabaseError) {
Log.d("database error ",error.message)
channel.close(error.toException())
}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()){
snapshot.children.forEach { data ->
data.children.forEach {newData->
newData.children.forEach { childData->
val userOrder = UserOrder(
childData.key!!,
childData.child("item_name").value as String,
childData.child("item_price").value as String,
childData.child("item_quantity").value as String,
childData.child("item_weight").value as String
)
offer(userOrder)
}
}
}
channel.close()
}
}
})
awaitClose()
}
//Activity class code
viewModel.viewModelScope.launch {
val time = measureTimeMillis {
viewModel.getOrder().collect {
println("Item id is ${it.item_id}")
}
}
println("Total time taken is $time")
}
正在检索数据,但它正在主线程上 运行ning。我想 运行 它在后台线程上。这怎么可能?。告诉我任何人
您使用“绑定到 Dispatchers.Main.immediate
”的 viewModelScope
启动了协程。
这就是你的协程在主线程中运行的原因。
要跳线程,可以使用withContext
。
IO
dispatcher 可用于线程阻塞调用,我在给定的代码中没有看到。