kotlin - 如何在 kotlin 中安排重复任务?

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

最佳答案

你正在尝试调用

.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/

相关文章:

android - 从 Adapter 中的 Resources 获取一个字符串

spring - 如何解析和修改build.gradle.kts Kotlin Gradle构建脚本?

android - USB 未连接时 ScheduledExecutorService 停止

php - 30 分钟后将行从一个 MySQL 表移至另一个表

mysql - 批处理 mysql 脚本/计划运行批处理作业

generics - 在 Kotlin 中,如何判断 ":"是表示扩展还是返回?

kotlin - 相当于 `mapNotNull` 的结果是什么?

android - Koin 未找到类的定义,但已声明

javascript - 如何自动上传文件到Netsuite文件柜?

excel - 使用 .bat 文件和任务调度程序来执行 .vbs 文件