Android:等待与Kotlin协同路由的回调结果
在我当前的项目中,我正逐渐从RXJava过渡到协同程序。在这种情况下,我需要停止执行并等待回调返回的结果。我已通过以下方式将我的RXJava方法转换为使用协同路由:Android:等待与Kotlin协同路由的回调结果,android,kotlin,kotlin-coroutines,algolia,Android,Kotlin,Kotlin Coroutines,Algolia,在我当前的项目中,我正逐渐从RXJava过渡到协同程序。在这种情况下,我需要停止执行并等待回调返回的结果。我已通过以下方式将我的RXJava方法转换为使用协同路由: suspend fun fetchProducts(ids: List<String>) = suspendCoroutine<List<ProductItem>> { continuation -> val getProducts = repo.search(ids, nul
suspend fun fetchProducts(ids: List<String>) = suspendCoroutine<List<ProductItem>> { continuation ->
val getProducts = repo.search(ids, null, null)
getProducts.subscribe(
{ callResult ->
productRequestInProgress.postValue(false)
continuation.resume(callResult.result())
},
{ error ->
productRequestInProgress.postValue(false)
//continuation.resumeWithException(t)
}
)
}
您可以将协同程序包装在一个块中 运行新的协程并中断当前线程,直到 它的完成。
…
它的设计目的是将常规阻塞代码桥接到 以挂起样式编写的库
您可以将协同程序包装在一个块中 运行新的协程并中断当前线程,直到 它的完成。
…
它的设计目的是将常规阻塞代码桥接到 以挂起样式编写的库 是
await()
被定义为一个挂起函数,suspend关键字就像一个信号,表明此函数是一个长时间运行的任务,因此在await()的情况下应该异步运行
是一个挂起函数,如果我们被允许在没有couroutine或另一个挂起函数的情况下执行它,这意味着我们正在对错误运行的任务进行阻塞调用,因此我们不允许这样做
因此,可以从协同程序或另一个挂起函数调用挂起函数。该规则保证挂起函数内的长时间运行的任务不会阻塞主线程
此外,如果您正在使用launch,则应使用async
功能,而不是launch
启动用于启动和忘记工作,并且在完成后想要返回结果时使用async
通常,如果挂起函数具有返回类型,则使用async
否则使用launch
由于您希望返回产品的列表
,因此使用async,如下所示
viewModelScope.launch{
val products = viewModelScope.async(Dispathers.Default) { // Dispathers.Default is used for CPU intensive work, even if you don't pass anything Dispathers.Default is there , use Dispacther.IO for IO , Dispathers.Main for working with views in coroutine , like updating text view
fetchProducts(it.mapNotNull { it.id })
}.await()
}
是await()
被定义为一个挂起函数,suspend关键字就像一个信号,表明此函数是一个长时间运行的任务,因此在await()的情况下应该异步运行
是一个挂起函数,如果我们被允许在没有couroutine或另一个挂起函数的情况下执行它,这意味着我们正在对错误运行的任务进行阻塞调用,因此我们不允许这样做
因此,可以从协同程序或另一个挂起函数调用挂起函数。该规则保证挂起函数内的长时间运行的任务不会阻塞主线程
此外,如果您正在使用launch,则应使用async
功能,而不是launch
启动用于启动和忘记工作,并且在完成后想要返回结果时使用async
通常,如果挂起函数具有返回类型,则使用async
否则使用launch
由于您希望返回产品的列表
,因此使用async,如下所示
viewModelScope.launch{
val products = viewModelScope.async(Dispathers.Default) { // Dispathers.Default is used for CPU intensive work, even if you don't pass anything Dispathers.Default is there , use Dispacther.IO for IO , Dispathers.Main for working with views in coroutine , like updating text view
fetchProducts(it.mapNotNull { it.id })
}.await()
}
我不完全确定您是否需要额外的
launch
功能。您还应该能够将所需的信息传递给runBlocking函数,并在其中直接使用async{}.await()。先生,您是一个传奇人物,这很有效!只需补充一点(对于其他偶然发现这一点的人来说),您没有必要使用额外的启动功能。我将编辑答案我不完全确定您是否需要额外的launch
功能。您还应该能够将所需的信息传递给runBlocking函数,并在其中直接使用async{}.await()。先生,您是一个传奇人物,这很有效!只需补充一点(对于其他偶然发现这一点的人来说),您没有必要使用额外的启动功能。我将编辑答案
viewModelScope.launch{
val products = viewModelScope.async(Dispathers.Default) { // Dispathers.Default is used for CPU intensive work, even if you don't pass anything Dispathers.Default is there , use Dispacther.IO for IO , Dispathers.Main for working with views in coroutine , like updating text view
fetchProducts(it.mapNotNull { it.id })
}.await()
}