我目前正在停止并启动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
答案 0 :(得分:3)
我会添加一些批评,但这种方法相当稳固。
首先评论,有可能不会调用onStop()
。这种情况在Starting an Activity的最底部描述。因此,我会考虑将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
。