使用Kotlin进行参数回调

use*_*385 6 java android callback kotlin

我刚开始Kotlin,所以请保持友好:)

我有一个负责获取一些数据并通知主要活动其需要更新其UI的类。

所以我在DataProvider.kt中做了一个函数:

      fun getPeople(fromNetwork: Boolean, results: ((persons: Array<Person>, error: MyError?) -> Unit)) {

        // do some stuff stuff
        val map = hashMapOf(
                "John" to "Doe",
                "Jane" to "Smith"
        )

        var p = Person(map)
        val persons: Array <Person> = arrayOf (p)
        results(persons, null)
    }
Run Code Online (Sandbox Code Playgroud)

所以我想从我的活动中调用它,但是我找不到正确的语法!:

    DataProvider.getPeople(
            true,
            results =
    )
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多事情,但是我只想获取一组人和我的可选错误,以便可以更新UI。

目标是在我的数据提供程序中执行异步代码,以便我的活动可以等待它。

有任何想法吗 ?非常感谢您的帮助。

Zoe*_*Zoe 7

这实际上取决于您如何定义回调方法。如果使用独立功能,请使用::运算符。首先(当然),我应该解释语法:

(//these parenthesis are technically not necessary
(persons: Array<Person>, error: MyError?)//defines input arguments: an Array of Person and a nullable MyError
     -> Unit//defines the return type: Unit is the equivalent of void in Java (meaning no return type)
)
Run Code Online (Sandbox Code Playgroud)

因此该方法定义为:

fun callback(persons: Array<CustomObject>, error: Exception?){
    //Do whatever
}
Run Code Online (Sandbox Code Playgroud)

你这样称呼:

DataProvider.getPeople(
    true,
    results = this::callback
)
Run Code Online (Sandbox Code Playgroud)

但是,如果使用匿名回调函数,则略有不同。这也使用lambda:

getPeople(true, results={/*bracket defines a function. `persons, error` are the input arguments*/persons, error ->  {
        //do whatever
    }})
Run Code Online (Sandbox Code Playgroud)