正确停止和启动Scheduled Executor

时间:2014-08-19 03:09:16

标签: java android executorservice

我目前正在停止并启动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 cause: null

1 个答案:

答案 0 :(得分:3)

我会添加一些批评,但这种方法相当稳固。

首先评论,有可能不会调用onStop()。这种情况在Starting an Activity的最底部描述。因此,我会考虑将Executor创建和销毁移动到不同的相应方法。如果您想将创建保留在onResume()中,请将销毁和清理放在onPause()中。同样,如果您想将创建移至onCreate(...),请将销毁和清理移至onDestroy()。我个人更喜欢后者有两个原因:如果它与Activity绑定并且我希望它在后台运行,那么我会将它放在onCreate(...)中,这样即使Activity不再在,也可以继续运行焦点。此外,即使应用程序可以通过操作系统强制关闭,也可以保证调用onDestroy()

至于实际的代码清理,我假设periodicTaskScheduledFuture,但我们都知道假设。无论如何,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()足以终止ExecutorServiceperiodicTask