gpt4 book ai didi

android - 有没有更好的方法可以在协程中设置n次监听器?

转载 作者:行者123 更新时间:2023-12-02 13:42:52 27 4
gpt4 key购买 nike

在我的项目中,我根据List的大小在for循环内调用Firebase数据库 n 次,并通过获取每个侦听器的响应来返回结果。我正在协程中进行所有这些操作。这是我的代码

 fun Flow<List<Basket>>.mapBasketListToItemsList() : Flow<List<Items>> = map{it : List<Basket> ->
val itemsList = Collections.synchronizedList(ArrayList<Items>())

coroutineScope{
it.forEach {it : Basket ->
launch {
databaseReference.child("Items").child(it.itemsId!!)
.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {

}

override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists()) {
val item = dataSnapshot.getValue(Items::class.java)
itemsList.add(item!!)
}
}
})
}
}
}
itemsList
}

但是我感到很奇怪,因为我不知道我是否以正确的方式进行操作。所以我想知道是否有更好的 方法来完成这项工作。

最佳答案

您不能使用此类操作通过suspendCoroutine之类的函数来传递值的异步流,以免我们第二次尝试恢复延续时得到IllegalStateException,因为Kotlin暂停和延续是一次性的。

流被明确设计为表示多个值的冷异步流。您可以使用 callbackFlow 函数将多次回调转换为流:

用法示例:

fun flowFrom(api: CallbackBasedApi): Flow<T> = callbackFlow {
val callback = object : Callback { // implementation of some callback interface
override fun onNextValue(value: T) {
// To avoid blocking you can configure channel capacity using
// either buffer(Channel.CONFLATED) or buffer(Channel.UNLIMITED) to avoid overfill
try {
sendBlocking(value)
} catch (e: Exception) {
// Handle exception from the channel: failure in flow or premature closing
}
}
override fun onApiError(cause: Throwable) {
cancel(CancellationException("API Error", cause))
}
override fun onCompleted() = channel.close()
}
api.register(callback)
/*
* Suspends until either 'onCompleted'/'onApiError' from the callback is invoked
* or flow collector is cancelled (e.g. by 'take(1)' or because a collector's coroutine was cancelled).
* In both cases, callback will be properly unregistered.
*/
awaitClose { api.unregister(callback) }
}

Read More

关于android - 有没有更好的方法可以在协程中设置n次监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61886832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com