Kotlin Higher Order Function以可变数量的参数作为parameter passing一个函数

在我的应用程序中,我需要使用特定的框架来执行网络调用。 由于每个网络调用需要在单独的线程上执行,我想有一个函数启动新的线程执行调用并返回一个对象。 为此,我尝试使用HigherOrderFunctions,但直到现在我还没有发现如何将函数声明为一个参数,这个参数带有可变数量的参数。

给你一个想法,我想有这样的事情:

fun Client.performNetworkCall(calledFunction:(vararg Object)->Object):Object{ Thread(Runnable { calledFunction }).start() //return function results } 

但似乎不可能宣布这样的function。 Kotlin有可能吗? 我想避免在我需要执行网络调用时在每个代码中创建新线程。 所以我可以写这样的东西

 client.performNetworkCall{ bean.createNewUser(User("","","Gosia","gosiak@gmail.com","pass"))} 

bean是我的界面的对象,它有一个函数createNewUser。 函数createNewUser在服务器上实现,执行后会返回一些结果。

如果我想要做的是不可能使用更高阶的函数,你能给我一个提示,我还能做些什么,像我上面描述的?

无论您问的是什么,都是针对Android的最佳做法。 可能错误地提到了你的问题。 你需要一个函数在后台线程中执行高阶函数 ,(注意这里)立即返回值(意味着阻塞调用线程,直到后台任务完成)。

因为您必须知道网络调用应该是异步调用,因此您必须将接口传递给async方法作为参数,以便在高阶函数完成时通知您执行。

而更好的选择是使用协程作为后台调度任务的一个非常好的选择。

所以你的代码可以被转换为:

 async { var result = bean.createNewUser(User("","","Gosia","gosiak@gmail.com","pass")) // do whatever you want to do with result here } 

对于使用Coroutines,您必须在模块级gradle文件中添加以下行:

 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.21.2' 

注:协程现在处于试验阶段,可能会改变。

另一个选择使用kotlin anko库的doAsync ,它相当简单易用。

例:

 doAsync { var result = bean.createNewUser(User("","","Gosia","gosiak@gmail.com","pass")) // use result here to to further background task uiThread { // use result here if you want to update ui } } 

为了使用doAsync,在模块级gradle文件中添加以下行:

 compile "org.jetbrains.anko:anko-commons:0.10.0" 

要阅读doAsync的更多信息,请点击这里 。

希望能帮助到你。 如果您还有其他问题,请告诉我。