代码之家  ›  专栏  ›  技术社区  ›  Osborne Cox

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

  •  1
  • Osborne Cox  · 技术社区  · 12 年前

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

    1 回复  |  直到 9 年前
        1
  •  3
  •   Taylor Frey    12 年前

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

    首先,这里有潜力 onStop() 未调用。这种情况在 Starting an Activity 。因此,我会考虑将执行器的创建和销毁移至不同的相应方法。如果你想继续创作 onResume() ,然后在 onPause() 。同样,如果您想将创建移动到 onCreate(...) 然后将销毁和清理移至 onDestroy() 。我个人更喜欢后者,原因有两个:如果它与“活动”相关,并且我希望它在后台运行,那么我会将其放入 on创建(…) 以便即使“活动”不再聚焦,流程也可以继续运行。此外, on销毁() 即使操作系统可以强制关闭应用程序,也保证会被调用。

    至于实际的代码清理,我假设 periodicTask 是一个 ScheduledFuture ,但我们都知道假设。无论如何,a 计划的未来 除了能够关闭 Service 。因此,您可以按照以下方式实现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
        }
    }
    

    我喜欢尽可能明确地关闭和释放资源,尤其是涉及线程的资源。然而,这并非绝对必要。 shutdownNow() 足以终止 ExecutorService 周期性任务 .