【问题标题】:Are Activity and Service running in the same thread?Activity 和 Service 是否在同一个线程中运行?
【发布时间】:2013-06-12 15:07:51
【问题描述】:

我对处理程序、服务和活动的基本概念有些困惑。我在很多地方都看到过提到服务在 UI 线程中运行。我对这个声明有几个问题。

  • 以上说法是真是假??
  • 有人可以从 Android 参考中为 Service 解释此声明吗

    服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免 Application Not Responding 错误)。

  • 如果服务在 UI 线程中运行,则不适合繁重的工作。真/假??
  • 如果没有活动在运行,那么服务将在哪个线程中运行??如果以上陈述为真。
  • 如果上述说法属实?那么如果我在服务和活动中声明 Handler 会发生什么?因为单个 Thread 有一个 Handler 实例。
如果问题太菜鸟,请原谅我。

【问题讨论】:

  • 概念证明:启动一个activity,并从它的onCreate方法中启动一个服务,并在服务的onStartCommand中调用SystemClock.sleep(10000);观察到在服务内发生睡眠时,活动无法继续。

标签: android android-activity android-service


【解决方案1】:

以上说法是真是假?

在 Java 中的任何地方都没有对象在线程上“运行”。 方法在线程上运行。

因此,更准确的说法是 Service 上的生命周期方法 -- onCreate()onStartCommand()onBind()onDestroy() -- 在主应用程序线程上调用。

有人可以从 Android 的 Service 参考资料中解释一下这句话吗

我不知道如何解释比写的更好。虽然Service 可以管理后台线程,但Service 本身不是Thread

如果服务在 UI 线程中运行,那么它不适合繁重的工作

在 Java 中的任何地方都没有对象在线程上“运行”。 方法在线程上运行。

因此,更准确的说法是,您不应该在上述生命周期方法直接触发的工作上花费太多时间。

如果没有活动在运行,那么服务将在哪个线程中运行?

在 Java 中的任何地方都没有对象在线程上“运行”。 方法在线程上运行。

上述生命周期方法在主应用线程上调用,无论前台是否有活动,或者即使活动存在。

那么如果我声明 Handler 在服务以及活动中会发生什么?

您将拥有Handler 的实例。

因为单个 Thread 有一个 Handler 实例

Handler 的默认行为是将自身绑定到主应用程序线程,无论您是在 Activity 还是 Service 中创建 Handler

【讨论】:

  • 所以如果我的服务启动一个线程并且我想要一个这样的通信通道:线程可以向服务发送数据,而服务可以向活动发送数据。如果服务和活动处理程序与应用程序处理程序绑定,那么如果线程向服务发送消息,哪个处理程序将接收消息?
  • @KanwarSaad:消息将发送到您拨打sendMessage()Handler
  • 它不工作..所以我正在做的是在活动和服务中制作一个处理程序。将服务处理程序传递给新线程。然后线程使用该处理程序向服务发送消息。我将收到的消息复制到另一条消息,然后使用 UI 处理程序将其发送到 UI。这给了我 androidruntimeexception:此消息已在使用中。
  • @KanwarSaad:那么也许您应该考虑使用其他技术在组件之间进行通信,例如使用startService() 向服务发送命令,或者使用LocalBroadcastManager,或者使用像Otto 这样的第三方事件总线.无论如何,您当前的问题与您的原始问题无关。如果您希望有人帮助您调试 Handler 的使用,请提出一个新的 StackOverflow 问题,包括您正在使用的代码和显示异常的堆栈跟踪。
  • 谢谢.. 我会将此答案标记为正确,因为它回答了我的大部分问题。
【解决方案2】:

来自the official documentation

服务在其宿主进程的主线程中运行——服务 不创建自己的线程,也不在单独的进程中运行 (除非您另有说明)。这意味着,如果您的服务是 要做任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或联网),您应该在 做这项工作的服务。通过使用单独的线程,您将减少 应用程序无响应 (ANR) 错误的风险和 应用程序的主线程可以保持专用于用户交互 与您的活动。

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 2016-02-10
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2021-06-29
    相关资源
    最近更新 更多