android - Kotlin 高阶函数传递一个参数数量可变的函数作为参数

标签 android multithreading kotlin higher-order-functions

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

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

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

 //return function results

}

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

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

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

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

最佳答案

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

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

更好的选择是使用 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 .

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

关于android - Kotlin 高阶函数传递一个参数数量可变的函数作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48317252/

相关文章:

ios - 从 TableViewController 滞后呈现模态 ViewController

java - Java "assign and check"的 Kotlin 等价物是什么?

android - 在 Jelly Bean 等旧设备上获取 Samsung KNOX api 版本

android - Flutter:尝试向 FlutterEngine 自动注册插件,但找不到并调用 GeneratedPluginRegistrant

Python:如何管理和杀死卡住或等待超时的工作线程......?

android - 在新线程中将值插入数据库会导致进度对话框关闭

android - 我可以为参数值提供两个选项吗?

Android Studio KMM iOS 运行不会在 iPhone 模拟器中启动

java - 即使应用程序不在主要焦点,是否可以在后台应用程序中运行计时器?

android - Gradle的Android Proguard问题