Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:等待与Kotlin协同路由的回调结果_Android_Kotlin_Kotlin Coroutines_Algolia - Fatal编程技术网

Android:等待与Kotlin协同路由的回调结果

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

在我当前的项目中,我正逐渐从RXJava过渡到协同程序。在这种情况下,我需要停止执行并等待回调返回的结果。我已通过以下方式将我的RXJava方法转换为使用协同路由:

   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()
}