Отмена () и периодическое запланированное задание - PullRequest
0 голосов
/ 16 марта 2012

От Android Dev Ссылка:

public abstract boolean cancel (boolean mayInterruptIfRunning)

If the task has already started, then the mayInterruptIfRunning parameter
determines whether the thread executing this task should be interrupted in
an attempt to stop the task.

Это понятно для меня, когда речь идет о задачах, которые происходят только один раз. Но нет, когда у меня есть периодическое задание, и я хочу позволить ему завершить текущее «задание», но не начинать новое.

Правильно ли, что я не могу использовать ни один из тех прямо из коробки? Я думаю, что если я установлю аргумент в значение true, он может остановить текущую задачу до того, как она будет завершена, и если я изменю ее на false, и в данный момент выполняется задача, она ничего не делает. Это правильно?

Как бы я реализовал то, что хотел? Должен ли я каким-то образом опросить задачу, чтобы выяснить, выполняется ли она, и отменить ее, если обнаружу, что ее нет?

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Использовать ScheduledThreadPoolExecutor.shutdown () :

... ...
// At some point in the future if you want reject next periodic task submit
// after waiting for current periodic task finish.
scheduledThreadPoolExecutor.shutdown(); // <-- this will reject next periodic task submit.
scheduledThreadPoolExecutor.awaitTermination(10, TimeUnit.SECONDS); // <-- this will wait current periodic task finish.
... ...

awaitTermination () необходимо вызывать после shutdown (), что явно не указано в Android API, однако подробную документацию можно найти в официальном Java API .

0 голосов
/ 16 марта 2012

Не уверен насчет вашей среды в деталях, но, насколько я понимаю, вы используете какого-то исполнителя из java.util.concurrent, для которого запланировано периодическое задание.

В основном параметр cancel() определяет, следует ли прекратить выполнениенить принудительно.Если для него установлено значение false, то он просто позволяет программисту решать, когда прерывать запущенный поток, проверяя isCanceled() (говоря о чем-то, производном от Future и Runnable).

Таким образом, вызывая метод cancel(false)SheduledFuture, возвращенный Executor, должен работать для вас.Это не прервет запущенную задачу и не предотвратит ее повторный запуск.После вызова Future.get() сгенерирует исключение, которое приведет к тому, что исполнитель не запустит его в следующий запланированный раз.

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