Android - Kotlin:在异步乐趣中返回值

时间:2017-08-17 07:52:04

标签: android multithreading android-asynctask kotlin

我想问一下是否有可能返回'来自函数的值 如果函数在做AsyncTask?

例如:

kapt

这个函数的问题是AsyncTask还没有完成,所以我从函数中得到了一个错误的值,任何想法如何解决它?

使用接口是唯一的原因还是有一个像Swift一样的编译处理程序?

4 个答案:

答案 0 :(得分:8)

如果异步执行某些计算,则无法直接返回该值,因为您还不知道计算是否已完成。您可以等待它完成,但这将使该功能再次同步。相反,您应该使用回调:

fun readData(callback: (Int) -> Unit) {
    val num = 1
    doAsync { 
        for (item in 1..1000000){
            num += 1
        }
        callback(num)
    }
}

在电话会议上:

readData { num -> [do something with num here] }

您还可以尝试Kotlin coroutines,这使得异步代码看起来像常规同步代码,但对于初学者来说这些可能有点复杂。 (顺便说一下,你在Kotlin中不需要分号。)

答案 1 :(得分:1)

不仅在kotlin,任何编程语言to return from a async method 。但你能做的是:

  1. 像Christian建议的那样使用co-routines
  2. 使用像RxJava or RxKotlin这样的反应方法来处理数据流,即使你不能从不同线程的方法返回,你也可以从不同的线程中观察函数的返回类型。
  3. 如果你做的很简单,Callbacks可能会有所帮助。

答案 2 :(得分:0)

Kotlin的协同例程绝对是您的最佳选择。我从未真正尝试过,但是在异步任务中使用协同例程可以使您从协同例程的任务中返回值。我将尝试提出一段代码来证明这一点

答案 3 :(得分:0)

改为这样做:

fun readData() : Int{
    val num = 1;
    for (item in 1..1000000){
        num += 1;
    }
return num

}


val scope = CoroutineScope(Dispatchers.Main)

scope.launch{
async(Dispatchers.IO){
readData()
}.await()

}

通过使用类似上下文的异步块的替代方法也应该起作用:

fun readData() : Int{
    val num = 1;
    for (item in 1..1000000){
        num += 1;
    }
return num

}

 val scope = CoroutineScope(Dispatchers.Main)
     scope.launch {
                    withContext(Dispatchers.IO) { readData() }

然后在其他地方创建一个Courtine来异步运行此东西: