【问题标题】:Kotlin coroutines, is there a better way to return this value?Kotlin协程,有没有更好的方法来返回这个值?
【发布时间】:2019-02-28 16:40:52
【问题描述】:

在协程上苦苦挣扎,但是在将它传递到另一个网络协程与回调之前,有没有更好的方法来使用/获取长时间运行的调用的值?我见过其他人,但我似乎无法在最新的 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
        }
    }
}

稍后将添加作为答案,以防我仍然不在此/其他方面。

【问题讨论】:

  • 使用作用域协程,了解挂起和等待,你会喜欢的。

标签: android kotlin kotlin-coroutines


【解决方案1】:

您可以使用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 文件中

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

【讨论】:

  • 那么如果调用 someFunction 需要 onSuccess/onFail CallBack 的结果,那么 someFunction 也需要挂起?具有相同的返回类型,所以我可以链接它
  • 我不知道您的应用程序使用什么架构,但我会将 someFunction 放置在一些 Presenter 或 ViewModel 中,当调用 fun networkCall(params): Result 时,我会使用一些 Result 对象来检查无论失败与否。所以它可以是这样的:...val result = networkCall (params) if (result.isSuccess) { call some UI function to notify about success } else { call some UI function to notify about failure }
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2013-08-18
相关资源
最近更新 更多