在线程运行时在Service中调用stopSelf()

And*_*rew 19 service multithreading android

假设我的服务的onStart()处理程序中有代码来启动线程来执行某些操作然后调用stopSelf().

在线程完成之前调用stopSelf().究竟发生了什么?

我自己测试了这个,我的线程继续执行直到它完成.Android是否听到了stopSelf()调用,但推迟了它直到线程完成?

 @Override
 public void onStart(Intent intent, int startid) {
  new Thread(new Runnable() {
      public void run() {
        // TODO some long running operation
      }
    }).start();
  stopSelf();
 }
Run Code Online (Sandbox Code Playgroud)

Com*_*are 21

在线程完成之前调用stopSelf().究竟发生了什么?

线程运行完成.

Android是否听到了stopSelf()调用,但推迟了它直到线程完成?

不,你ServicestopSelf()通话时仍然被摧毁.你只是泄漏一个线程和Service对象,至少在线程终止之前.

您可能希望切换到IntentService,因为它集成了后台线程和stopSelf()模式.

  • 因此,如果我理解正确,IntentService将在线程中的onHandleIntent中执行代码; 所以我不需要对我的代码进行任何线程处理.此外,当代码执行完毕后,IntentService将自行终止.如果另一个Intent传递给IntentService,它将在执行一个Intent时处理该Intent.当一切都完成后,就会自杀.在IntentService之外,我需要做的就是用我的Intent调用startService.是? (2认同)
  • @Andrew:"是吗?" - 是的 "有没有办法强迫Intent到队列的前面?" - 不是我知道的,尽管你可以用某种方式用'PriorityQueue`替换队列.IIRC,`IntentService`不是一个非常大的类,所以你可以克隆它来调整队列实现以满足你的需求. (2认同)