Kotlin 高阶函数传递一个参数数量可变的函数作为参数
Kotlin Higher Order Function pass a function with variable number of arguments as the parameter
在我的应用程序中,我需要使用特定框架执行网络调用。
因为每个网络调用都需要在单独的线程上执行,所以我希望有一个启动新线程的函数执行调用和 return 一个对象。
为此,我尝试使用 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 是在服务器上实现的,执行后会 return 一些结果。
如果使用高阶函数无法实现我想做的事情,你能给我一个提示,我还能做些什么来获得如上所述的东西?
无论您提出什么问题,都违反了 Android 最佳实践。您可能错误地提到了它。您希望函数在后台线程中执行 高阶函数 并且(注意此处)立即 return 值(意味着阻塞调用线程直到后台任务完成)。
你一定知道网络调用应该是异步调用,为此你必须将一个接口作为参数传递给异步方法,这样当你的高阶函数 完成它的执行。
更好的选择是使用 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。
希望对您有所帮助。如果您还有其他问题,请告诉我。
在我的应用程序中,我需要使用特定框架执行网络调用。 因为每个网络调用都需要在单独的线程上执行,所以我希望有一个启动新线程的函数执行调用和 return 一个对象。 为此,我尝试使用 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 是在服务器上实现的,执行后会 return 一些结果。
如果使用高阶函数无法实现我想做的事情,你能给我一个提示,我还能做些什么来获得如上所述的东西?
无论您提出什么问题,都违反了 Android 最佳实践。您可能错误地提到了它。您希望函数在后台线程中执行 高阶函数 并且(注意此处)立即 return 值(意味着阻塞调用线程直到后台任务完成)。
你一定知道网络调用应该是异步调用,为此你必须将一个接口作为参数传递给异步方法,这样当你的高阶函数 完成它的执行。
更好的选择是使用 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。
希望对您有所帮助。如果您还有其他问题,请告诉我。