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

时间:2019-10-11 11:19:18

标签: kotlin scheduled-tasks

我想每隔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 个答案:

答案 0 :(得分:1)

您正尝试致电

if (!word) {
  display("clank");
} else if (word.length == 1) {
  display("thunk");
} else {
  while (word.length > 1) {
    facky = facky * word.length; //multiply facky with size until size is 0. Basically it is caulculating a factorial
    word.length = word.length - 1;
  }
  clunk(facky);
}

因此,您将.schedule(refreshImages(knownPosts, knownFiles, httpClient), TimeUnit.MINUTES.toMillis(5)) 结果作为第一个参数传递,而第二毫秒则传递了毫秒数。

从编译错误中您可以看到,Timer类有两个refreshImages(knownPosts, knownFiles, httpClient)方法,但是都希望使用TimerTask作为参数。而且您的schedule()方法不会返回TimerTask,因此不会编译。

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

我的猜测是,您希望传递一个将在一段时间后执行 的功能。那不是你现在正在做的。您正在做的是立即执行refreshImages,并将其返回值传递给refreshImages()

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

时间表扩展功能的签名是

schedule()

因此,如您所见,它的第一个参数是一个延迟,而第二个参数是一个以inline fun Timer.schedule( delay: Long, crossinline action: TimerTask.() -> Unit ): TimerTask 作为接收者的函数。因此,您可以使用延迟作为第一个参数,使用lambda作为第二个参数来调用此扩展函数:

TimerTask