gpt4 book ai didi

java - 正确停止和启动 Scheduled Executor

转载 作者:行者123 更新时间:2023-11-29 05:19:28 24 4
gpt4 key购买 nike

我目前正在停止和启动一个 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

最佳答案

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

首先评论,有可能 onStop() 没有被调用。 Starting an Activity 的最底部描述了这种情况。 .因此,我会考虑将 Executor 的创建和销毁移动到不同的相应方法。如果您想将创建保留在 onResume() 中,则将销毁和清理放在 onPause() 中。同样,如果您想将创建移动到 onCreate(...),则将销毁和清理移动到 onDestroy()。我个人更喜欢后者,原因有二:如果它绑定(bind)到 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() 足以终止 ExecutorServiceperiodicTask

关于java - 正确停止和启动 Scheduled Executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com