为什么我的服务会阻止UI?

时间:2012-06-19 10:42:23

标签: android

我从Activity(活动A)创建了一个服务(服务B)。从服务B,我创建了另一个服务(服务C)。以前服务C曾经是一个线程而不是一个服务。由于长期存在问题,我将其改为服务。服务C运行一个带有3秒Thread.sleep调用的while循环。但一般情况下它并没有停止。日志显示服务正在运行。但UI被阻止,几分钟后系统会问我是否要关闭。

如何使此服务无阻塞通话?

4 个答案:

答案 0 :(得分:3)

来自Android中的服务文档

服务不是一个单独的过程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它与其所属的应用程序运行的过程相同。

服务不是线程。它不是从主线程开始工作的手段(以避免应用程序无响应错误)。

在这种情况下,最好的方法是启动一个新线程,然后从那里调用服务。

答案 1 :(得分:2)

我认为服务C正在主线程上运行,尝试创建另一个线程(新线程或asynctask)

答案 2 :(得分:2)

是的,从文档中可以看出,服务不是单独的流程。 相反,请按照以下方式使其正常工作:

  1. 从您想要开始的任何地方开始提供服务
  2. 在你编写的服务类中,编写另一个私有类扩展线程,这将确保所有后台内容都将在与邮件进程分开的后台线程中运行
  3. 从服务类的onCreate方法启动一个线程。如果您在onStartCommand中开始后台工作,则可能会意外启动执行相同任务的多个服务。 防爆。您已经为活动提供了一个按钮,该按钮将启动后台服务。如果您碰巧多次点击它,它将在后台启动那么多服务。
      

    因此,如果你在服务中使用覆盖onCreate方法,它将检查服务是否已经运行,如果它没有运行,它将启动服务。否则它将跳过并且不会启动另一项服务。

答案 3 :(得分:0)

服务始终在主线程上运行。 您需要在服务C中生成后台线程或重复运行TimerTask等,以避免阻塞UI线程。