【问题标题】:Kotlin Higher Order Function pass a function with variable number of arguments as the parameterKotlin 高阶函数传递具有可变数量参数的函数作为参数
【发布时间】:2018-06-27 06:53:13
【问题描述】:

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

为了给你一个想法,我想要这样的东西:

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

 //return function results

}

但是声明这样的函数似乎是不可能的。 在科特林有可能吗? 当我需要执行网络调用时,我想避免每次在我的代码中创建新线程。这样我就可以写出这样的东西了

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

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

如果使用高阶函数无法实现我想要做的事情,你能否给我一个提示,我还能做些什么来得到我上面描述的东西?

【问题讨论】:

  • 你总是可以传入一个Array<Object>,不管怎样,可变参数语法只是糖。
  • 你为什么不用 RxJava?

标签: android multithreading kotlin higher-order-functions


【解决方案1】:

无论您提出什么要求,都违反了 Android 最佳做法。可能是您错误地提到了它。您希望一个函数在后台线程中执行高阶函数并(注意这里)立即返回值(意味着阻塞调用线程直到后台任务完成)。

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

更好的选择是使用Coroutines 一个非常好的替代方案来安排后台任务。

所以你给定的代码可以这样转换:

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

为了使用协程,你必须在模块级别的 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 的内容,请点击here

希望对您有所帮助。如果您还有其他问题,请告诉我。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
  • 2015-09-22
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多