Android - Kotlin:异步返回值

Posted

技术标签:

【中文标题】Android - Kotlin:异步返回值【英文标题】:Android - Kotlin : return value in async fun 【发布时间】:2018-01-25 12:49:32 【问题描述】:

我想问一下是否可以从函数中“返回”一个值 如果函数在做 AsyncTask?

例如:

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

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

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

【问题讨论】:

在这个意义上没有办法返回一个值。你可以使用回调函数。 【参考方案1】:

如果你异步执行一些计算,你不能直接返回值,因为你不知道计算是否已经完成。您可以等待它完成,但这会使函数再次同步。相反,您应该使用回调:

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 中不需要分号。)

【讨论】:

我认为你错过了围绕回调参数 Int:fun readData(callback: (Int) -> Unit) 的括号,否则 android Studio 会给出警告错误(正在编辑)【参考方案2】:

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

    像 Christian 建议的那样使用 co-routines。 使用像RxJava or RxKotlin 这样的响应式方法并处理数据流,即使您无法从不同线程中的方法返回,您也可以观察不同线程中函数的返回类型。 如果您正在做非常简单的事情,Callbacks 会很有帮助。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

就这样做吧:

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来异步运行这个东西:

【讨论】:

以上是关于Android - Kotlin:异步返回值的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

Kotlin 在异步进度结束时返回

Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )

Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )