我想每隔X分钟在后台调用一些api,然后处理我得到的json文件
我已经阅读了这份文档:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/java.util.-timer/schedule.html
我是 kotlin 的新手(我以前使用过 java),我不知道如何使用这些函数,任何使用示例都会有所帮助。
现在我有这样的东西:
Timer("NameOfMyTimer", true).schedule(refreshImages(knownPosts, knownFiles, httpClient), TimeUnit.MINUTES.toMillis(5))
结果是:
None of the following functions can be called with the arguments supplied:
public open fun schedule(p0: TimerTask!, p1: Date!): Unit defined in java.util.Timer
public open fun schedule(p0: TimerTask!, p1: Long): Unit defined in java.util.Timer
我做错了什么?我应该如何调用这些函数? 我认为我应该将我的函数“refreshImages”传递给带有参数列表的计时器,它应该被调用......? 我想我只是没有正确理解“功能就是对象”的理念。
最佳答案
你正在尝试调用
.schedule(refreshImages(knownPosts, knownFiles, httpClient), TimeUnit.MINUTES.toMillis(5))
因此,您将 refreshImages(knownPosts, knownFiles, httpClient)
的结果 作为第一个参数传递,并将毫秒数作为第二个参数传递。
从编译错误中可以看出,Timer 类有两个 schedule()
方法,但都需要一个 TimerTask 作为参数。而且您的 refreshImages
方法不会返回 TimerTask,因此无法编译。
如果您想使用这两种 Timer 方法中的一种,您需要创建一个 TimerTask 实例,并将其作为参数传递。
我的猜测是您希望传递一个将在延迟一段时间后执行的函数。那不是你现在正在做的。您正在做的是立即执行 refreshImages()
,并将其返回值传递给 schedule()
。
native Timer 调度方法无法传递函数:它不期望函数,而是 TimerTask。但是正如您链接到的 Kotlin 文档所示,可以通过调用 Kotlin 标准库的扩展函数之一。
schedule扩展函数的签名是
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask
因此,如您所见,它的第一个参数是延迟,第二个参数是一个以 TimerTask
为接收者的函数。因此,您可以使用延迟作为第一个参数并使用 lambda 作为第二个参数来调用此扩展函数:
timer.schedule(TimeUnit.MINUTES.toMillis(5)) {
refreshImages(knownPosts, knownFiles, httpClient)
}
关于kotlin - 如何在 kotlin 中安排重复任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58340167/