В настоящее время я останавливаю и запускаю 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
Osborne Cox 19 Авг 2014 в 07:09

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.

3
Taylor Frey 19 Авг 2014 в 09:04
Следовал второму подходу: oncreate () и onDestroy (), поскольку он мне нужен в действии.
 – 
Ravi Yadav
27 Сен 2016 в 08:26