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

Я хочу использовать сопрограммы вместо обработчиков. У меня есть вызов, который будет обновлять данные каждые несколько секунд. Он вызывается в Job объекте. Когда я оставляю приложение в фоновом режиме, я хочу отменить это Job. Когда я возвращаюсь в приложение, я хочу перезапустить эту работу, чтобы выполнить свою работу.

Но как только я отменю работу, она больше не перезапустится. Есть ли способ, как возобновить отмененную работу? Потому что isActive == false даже когда я повторно инициализирую переменную

var job: Job? = null

job = launch {
    while (isActive){
    delay(5000)
    doStuff()
    }
}

Когда я приостанавливаю свою активность, я вызываю job?.cancel() и job = null. Когда я ввожу активность, я снова вызову код выше. Я думал, что смогу повторно инициализировать эту работу и снова запустить код обновления.

Ответы [ 2 ]

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

Вы не можете «перезапустить» задание, но вы можете создать новое, когда заключите код внутри:

var job = launch { jobFunction() }

fun jobFunction() {
    while (isActive){
      delay(5000)
      doStuff()
    }
}

if(job.isActive.not()) {
  job = launch( jobFunction() )
}
2 голосов
/ 11 октября 2019

Невозможно перезапустить cancel() задание. Но это достаточно легко обойти. Просто начните новую работу вместо этого. Вы можете сделать это так:

fun launchNewJob() = launch {
    while (isActive) {
        delay(5000)
        doStuff()
    }
}

job = launchNewJob()

Job с / сопрограммы не являются тяжелыми объектами, такими как Thread с, поэтому вам не нужно беспокоиться о создании новых.

...