【问题标题】:Android - Kotlin : return value in async funAndroid - Kotlin:异步返回值
【发布时间】: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 那样的编译处理程序?

【问题讨论】:

  • 在这个意义上没有办法返回一个值。你可以使用回调函数。

标签: android multithreading android-asynctask kotlin


【解决方案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不可能。但是你可以做的是:

  1. 像 Christian 建议的那样使用 co-routines
  2. 使用像RxJava or RxKotlin 这样的响应式方法并处理数据流,即使您无法从不同线程中的方法返回,您也可以观察不同线程中函数的返回类型。
  3. 如果您正在做非常简单的事情,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来异步运行这个东西:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2012-12-20
        • 2011-06-01
        相关资源
        最近更新 更多