如何在 Kotlin 中安排重复任务?

4
我想每隔 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”与应该调用它的参数列表一起传递给定时器……? 我想我只是没有正确理解“函数是对象”的哲学。

1个回答

4
你正在尝试调用
.schedule(refreshImages(knownPosts, knownFiles, httpClient), TimeUnit.MINUTES.toMillis(5))

所以,你需要将refreshImages(knownPosts, knownFiles, httpClient)结果作为第一个参数传递,并传递毫秒数作为第二个参数。

从编译错误可以看出,Timer类有两个schedule()方法,但两者都需要TimerTask作为参数。而你的refreshImages方法并不返回TimerTask,所以无法编译通过。

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

我猜测你想要传递一个延迟一段时间后会被执行的函数。但你现在做的是立即执行refreshImages(),然后将其返回值传递给schedule()

原生的Timer schedule方法不支持传递函数:它需要的是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)
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接