Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确停止和启动计划执行器_Java_Android_Executorservice - Fatal编程技术网

Java 正确停止和启动计划执行器

Java 正确停止和启动计划执行器,java,android,executorservice,Java,Android,Executorservice,我当前正在停止并启动一个计划执行器,如下所示: public class MyActivity extends Activity { ScheduledExecutorService executor; ... ... } protected void onResume() { super.onResume(); executor = Executors.newSingleThreadScheduledExecutor(); 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;
}
我想知道这是否是停止和启动执行器服务的正确方法

这种实现可能会导致任何问题吗

在试图找到解决方案时,我也提到了这个问题:

我将补充一些评论,但这种方法相当可靠

第一个注释是,可能不调用
onStop()
。这种情况在本书的最底层有描述。因此,我会考虑将执行器创建和销毁移动到不同的对应方法。如果要将创建保留在
onResume()
中,请将销毁和清理放在
onPause()
中。同样,如果要将创建移动到
onCreate(…)
,则将销毁和清理移动到
onDestroy()
。我个人喜欢后者有两个原因:如果它与活动相关,并且我希望它在后台运行,那么我将把它放在
onCreate(…)
中,这样即使活动不再集中,流程也可以继续运行。此外,即使应用程序可由操作系统强制关闭,也保证调用
onDestroy()

至于实际的代码清理,我假设
periodicTask
是一个
ScheduledFuture
,但我们都知道一些假设。无论如何,
ScheduledFuture
除了能够关闭
服务之外,还有一种取消正在运行的任务的方法。因此,您可以按照以下方式实现finish方法:

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
    }
}

我喜欢尽可能明确地关闭和释放资源,特别是涉及线程的资源。然而,这并不是绝对必要的
ShutdowNow()
足以终止
ExecutorService
periodicTask

遵循第二种方法:oncreate()和onDestroy(),因为我在活动中需要它