【问题标题】:Stopping and starting Scheduled Executor properly正确停止和启动 Scheduled Executor
【发布时间】:2014-08-19 03:09:15
【问题描述】:

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

【问题讨论】:

    标签: java android executorservice


    【解决方案1】:

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

    第一条评论,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

    【讨论】:

    • 遵循第二种方法:oncreate() 和 onDestroy(),因为我在活动中需要它
    猜你喜欢
    • 2022-07-03
    • 2021-10-25
    • 2022-01-21
    • 1970-01-01
    • 2013-01-02
    • 2023-03-25
    • 2016-11-01
    • 2017-05-22
    • 2016-07-19
    相关资源
    最近更新 更多