android - Kotlin协程,有没有更好的方法来返回这个值?

标签 android kotlin kotlin-coroutines coroutine coroutinescope

与协程作斗争,但有没有更好的方法来使用/获取此处长时间运行的调用的值,然后再将其传递给带有回调的另一个网络协程?我见过其他人,但我似乎无法使用最新的 droid 协程版本的值,就像我似乎无法使这项工作一样 Kotlin Coroutines with returning value

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

稍后会添加为答案,以防我对此/其他问题仍然不满意。

最佳答案

您可以使用launch coroutine builder来启动协程:

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()设置为suspend,这样就不需要使用callback了。

要在 Android 中使用 Dispatchers.Main,请将依赖项添加到应用程序的 build.gradle 文件

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'

关于android - Kotlin协程,有没有更好的方法来返回这个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54930416/

相关文章:

android - 应用内结算 - 生成的 IInAppBillingService.java 出错

android - 在混淆器中使用 "dontwarn"

kotlin - 将两个状态流合并成新的状态流

kotlin - 是什么让 Iterable.map 与挂起函数一起工作?

android - 如何将协程 Flow<List<T>> 转换为 List<T>

android - 将文件添加到 .apk

android - android应用程序中的按钮导致空指针错误

android - Android Studio Kotlin二维Button数组得到java.lang.ArrayIndexOutOfBoundsException:length = 0;索引= 0

kotlin - 为什么我们使用 "companion object"作为 Kotlin 中 Java 静态字段的一种替代品?

service - 如何从 FirebaseMessagingService 调用挂起函数?