2017-08-17 101 views
2

我想問一下,如果函數做AsyncTask,是否有可能從函數'返回'一個值 ?Android - Kotlin:在異步樂趣中的返回值

例如:

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

在這個函數的問題是,是的AsyncTask不完又那麼我從功能的錯誤值,任何想法如何解決呢?

正在使用一個接口是唯一的原因或存在像Swift一樣的編譯處理程序?

+0

沒有辦法從這個意義上返回一個值。你可以使用回調函數。 – fjc

回答

3

如果您異步執行一些計算,則不能直接返回該值,因爲您不知道計算是否已完成。您可以等待它完成,但這會使該功能再次同步。相反,你應該有回調的工作:

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一試,這使得異步代碼看起來像普通的同步代碼,但這些可能是有點複雜的初學者。 (順便說一句,你不需要在科特林分號。)

0

不僅在kotlin,這是不可能任何編程語言to return from a async method。但你可以做的是:

  1. 使用co-routines像基督教的建議。
  2. 使用像RxJava or RxKotlin這樣的反應式方法處理數據流,即使您不能從您的方法在不同線程中返回,您可以觀察到不同線程中函數的返回類型。
  3. 如果您所做的事情非常簡單,Callbacks會有所幫助。