5

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

如何使此服务非阻塞调用?

4

4 回答 4

3

来自 Android 中的服务文档

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

服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。

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

于 2012-06-19T10:50:57.543 回答
3

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

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

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

于 2016-05-01T06:37:33.687 回答
2

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

于 2012-06-19T10:47:45.563 回答
0

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

于 2012-06-19T10:49:33.077 回答