Kotlin Coroutines,有没有更好的方法来返回此值



与Coroutines斗争,但是有一种更好的方法可以使用/获取长时间运行的值,然后再将其传递到带有回调的另一个网络coroutine之前?我已经看过其他人,但是我似乎无法使用最新的Droid coroutine版本使用该值,就像我似乎无法使这项工作具有返回值的Kotlin Coroutines

private suspend fun launchGeneratePayload(): String? { 
    return withContext (Dispatchers.Default) {
        try {
            val payloadString = slowStringGeneration()//Slow
            return@withContext payloadString
        } catch (e: java.lang.Exception) {
            return@withContext null
        }
    }
}

最终使用该值的地方

public someFunction(callback: CallBack) {      
    val params: JSONObject = JSONObject()
    params.put("param1", "param1Value")
    runBlocking{ //probably should be launch or similar
        val payload = launchGeneratePayload()
        params.put("param2", payload)
        //call network function with params & callback
        //networkCall (
    } 
}

感谢您的任何帮助

编辑:我认为实际上正在寻找的与

有所不同
suspend fun launchGeneratePayload(): String? =
    withContext(Dispatchers.Default) {
        try {
            slowStringGeneration() //slow
        } catch (e: java.lang.Exception) {
             null
        }
    }
}

将添加为答案,以后我仍然不在此/else。

您可以使用launch Coroutine Builder启动Coroutine:

private var job: Job = Job()
private var scope = CoroutineScope(Dispatchers.Main + job)
fun someFunction(callback: CallBack) {
    val params: JSONObject = JSONObject()
    params.put("param1", "param1Value")
    scope.launch { // launch the coroutine
        val payload = generatePayload() // generate String without blocking the main thread
        params.put("param2", payload)
        //call network function with params & callback
        //networkCall (params, callback)
    }
}
suspend fun generatePayload(): String? = withContext(Dispatchers.Default) {
    try {
        slowStringGeneration() //slow
    } catch (e: java.lang.Exception) {
        null
    } 
}

注意:您也可以将networkCall()作为暂停,那么您不需要使用callback

在Android中使用Dispatchers.Main添加依赖性对应用程序的build.gradle文件

实施 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'

相关内容

  • 没有找到相关文章

最新更新