В настоящее время я останавливаю и запускаю Scheduled Executor
следующим образом:
public class MyActivity extends Activity {
ScheduledExecutorService executor;
...
...
}
protected void onResume() {
super.onResume();
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(periodicTask, 0, 2, TimeUnit.SECONDS);
System.out.println("ACTIVITY HAS BEEN RESUMED");
}
protected void onStop() {
super.onStop();
System.out.println("ACTIVITY HAS BEEN STOPPED");
executor.shutdownNow();
executor = null;
}
Мне было интересно, действительно ли это правильный способ остановить и запустить Executor Service
.
Может ли эта реализация потенциально вызвать какие-либо проблемы в будущем?
Я также упомянул этот вопрос, пытаясь найти решение для этого: Android ScheduledThreadPoolExecutor, причина: null
1 ответ
Я добавлю несколько критических замечаний, но это довольно надежный подход.
Первый комментарий, есть вероятность, что onStop()
не вызывается. Такой случай описан в самом низу раздела Начало действия. . Таким образом, я бы подумал о переносе создания и уничтожения Executor в разные соответствующие методы. Если вы хотите сохранить создание в onResume()
, поместите разрушение и очистку в onPause()
. Аналогичным образом, если вы хотите переместить создание в onCreate(...)
, переместите разрушение и очистку в onDestroy()
. Я лично предпочитаю последний по двум причинам: если он привязан к Activity и я ожидаю, что он будет работать в фоновом режиме, я помещу его в onCreate(...)
, чтобы процесс мог продолжать работать, даже если Activity больше не находится в фокус. Кроме того, гарантированно вызывается onDestroy()
, даже если приложение принудительно закрывается ОС.
Что касается фактической очистки кода, я предполагаю, что periodicTask
- это ScheduledFuture
, но мы все знаем о предположениях. В любом случае, ScheduledFuture
имеет метод отмены выполняющейся задачи в дополнение к возможности выключить Service
. Таким образом, вы можете реализовать метод отделки в следующих строках:
private void finishScheduledExecutor() {
if (periodicTask != null) {
periodicTask.cancel(false); // true if it can be interrupted, false if you'd like it
// to finish its current iteration
}
if (executor != null) {
executor.shutdown(); // shutdown will allow the final iteration to finish
// executing where shutdownNow() will kill it immediately
}
}
Мне нравится явно закрывать и освобождать ресурсы, особенно с использованием потоков, когда это возможно. Однако в этом нет необходимости. shutdownNow()
подходит для завершения ExecutorService
и periodicTask
.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.