首页 > 解决方案 > 如何在 kotlin 中安排重复任务?

问题描述

我想每隔 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”传递给计时器,其中包含应该调用的参数列表......?我想我只是没有正确理解“功能就是对象”的理念。

标签: kotlinscheduled-tasks

解决方案


你试图打电话

.schedule(refreshImages(knownPosts, knownFiles, httpClient), TimeUnit.MINUTES.toMillis(5))

因此,您将 的结果作为第一个参数传递refreshImages(knownPosts, knownFiles, httpClient),并将毫秒数作为第二个参数传递。

从编译错误中可以看出,Timer 类有两个schedule()方法,但都期望 TimerTask 作为参数。而且您的refreshImages方法不会返回 TimerTask,因此无法编译。

如果您想使用这两个 Timer 方法之一,您需要创建一个 TimerTask 实例,并将其作为参数传递。

我的猜测是您想传递一个在延迟后执行的函数。那不是你现在正在做的事情。您正在做的是refreshImages()立即执行,并将其返回值传递给schedule().

使用本机 Timer 调度方法无法传递函数:它不需要函数,而是 TimerTask。但正如您链接到的 Kotlin 文档所示,可以通过调用 Kotlin 标准库的扩展函数之一来实现。

调度扩展函数的签名是

inline fun Timer.schedule(
    delay: Long,
    crossinline action: TimerTask.() -> Unit
): TimerTask

因此,如您所见,它的第一个参数是延迟,第二个参数是TimerTask作为接收器的函数。因此,您可以使用延迟作为第一个参数,使用 lambda 作为第二个参数来调用此扩展函数:

timer.schedule(TimeUnit.MINUTES.toMillis(5)) {
    refreshImages(knownPosts, knownFiles, httpClient)
}


推荐阅读