Как запланировать повторение задания в котлине? - PullRequest
0 голосов
/ 11 октября 2019

Я хочу вызывать некоторые API в фоновом режиме каждые X минут, а затем обрабатывать json-файл, который я получаю

Я просочился в эту документацию: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/java.util.-timer/schedule.html

Я новичокto 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 Ответ

1 голос
/ 11 октября 2019

Вы пытаетесь вызвать

.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 в качестве получателя. Таким образом, вы можете вызвать эту функцию расширения, используя задержку в качестве первого аргумента и лямбду в качестве второго аргумента:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...