【问题标题】:why my service block the UI?为什么我的服务会阻止 UI?
【发布时间】:2012-06-21 09:27:43
【问题描述】:

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

如何使这个服务非阻塞调用?

【问题讨论】:

  • 您是否在服务 C 中创建了线程,因为服务也在主线程中运行。
  • 我只是从服务 B 调用 startService 来启动服务 C。
  • 那么服务 B 是否在其他线程中工作?
  • 它是(服务B)只调用一些位置监听器

标签: android


【解决方案1】:

来自 Android 中的服务文档

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

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

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

【讨论】:

  • 但是当我在线程中运行较长时间时,线程会导致整个应用程序崩溃。 :(
  • 你能粘贴代码和错误日志吗?这会很有帮助
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-17
        相关资源
        最近更新 更多