使用ScheduledExecutorService和Service中的newSingleThreadScheduledExecutor调度任务,导致任务在多个线程中运行

时间:2016-06-23 10:53:39

标签: java android multithreading android-service

在我的Android应用中,我通过在MyActivity

中启动服务来安排任务
@Override
protected void onResume() {
   super.onResume();

   synchronized (this) {
      if (!serviceDidStart) {
         serviceDidStart = true;
         Intent intent = new Intent(this, CustomService.class);
         startService(intent);
   }
}

@Override
protected void onPause() {
   super.onPause();

   Intent intent = new Intent(this, CustomService.class);
   stopService(intent);
   serviceDidStart = false;
}

然后在我的CustomService

private ScheduledExecutorService scheduler;
private scheduled = false;
private Runnable repeatingTask = new Runnable() {
   @Override
   public void run() {
      System.out.println("Thread: " + Thread.currentThread().getId());
   }
};

@Override
public void onCreate() {
   scheduler = Executors.newSingleThreadScheduledExecutor();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

   if (!scheduled) {
      scheduler.scheduleWithFixedDelay(repeatingTask, 0, 5, TimeUnit.SECONDS);
      scheduled = true;
   }

    return Service.START_STICKY;
}

我希望任务只在一个线程中安排和执行,这应该会产生如下输出:

  

线程:350

     

线程:350

     

线程:350

如果我在发布后没有做任何其他事情,那就没事了。但是,如果我按下主页按钮,然后恢复我的应用程序,输出和任务调度会变得如下:

  

线程:350

     

主题:362

     

线程:367

     

线程:350

     

主题:362

     

线程:367

我做错了什么吗?如果我想在应用程序的生命周期中仅在一个线程中安排并执行repeatingTask(即使在我暂停并恢复活动后仅使用一个线程进行调度和执行任务),我该怎么办呢?

我对Android和Java开发很新,我不知道在我的情况下出了什么问题。任何帮助和指导都会很棒,谢谢!

更新和修改

  • serviceDidStart = false;的{​​{1}}
  • 中添加MyActivity

1 个答案:

答案 0 :(得分:0)

这是因为当你按下home时,会创建一个新的instacne并且旧的线程执行程序不会消失或停止。尝试根据您的需要在onDestroyvar errors = '@Html.Raw(Json.Encode(ViewData.ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage)))'; var errorMessage=JSON.parse(errors); 中添加executor.shutdownnow或变体。