3

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

  • 以上说法是真是假??
  • 有人可以从服务的android参考中解释这个声明吗

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

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

4

2 回答 2

5

以上说法是真的还是假的?

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

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

有人可以从服务的android参考中解释这个声明吗

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

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

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

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

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

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

前面提到的生命周期方法在主应用线程上被调用,不管前台是否有活动,或者即使活动存在。

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

你会有一个Handler.

因为单个 Thread 有一个 Handler 实例

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

于 2013-06-12T15:13:45.990 回答
1

官方文档

服务在其宿主进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。这意味着,如果您的服务要执行任何 CPU 密集型工作或阻塞操作(例如 MP3 播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应 (ANR) 错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

于 2015-06-30T13:30:15.260 回答