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(),因为我在活动中需要它