2012-06-10 150 views
3

Activity启动的ActivityService运行后台线程是否有区别? 加入:后台线程不会与用户界面进行交互。Android后台线程:从活动启动和服务启动之间的区别

我目前有一些后台线程从Activity启动。大多数是通过AsyncTask和一个是通过我自己的ExecutorService。我想知道重构代码以将它们移到ServiceIntentService是否有重大好处。

+1

这取决于你的'AsyncTasks'做什么。 AsyncTask的意义在于它充当后台线程和Activity UI之间的桥梁。如果您不需要任何与UI进行前/后交互或进行线程正在执行的更新,则不需要“AsyncTask”。因此,您可以简单地在您的'Activity'中调用一个通用的'Thread',或者将其转换为'Service'。 – Squonk

+0

一个服务可以出来活动,我相信一个AsyncTask不能。像Squonk说的那样,用AsyncTask进行UI交互更容易。 – Ran

回答

3

您似乎对活动和服务的定义感到困惑。要清楚:

  • 活动是根据活动的生命周期状态机运行的东西。相应处理程序中的代码与附加到UI的事件循环进行交互。
  • 服务是根据服务生命周期状态机运行的东西。相应生命周期处理程序中的代码执行操作以处理诸如Intent等等的事情,但而不是通过UI与用户交互。

这两项,然而,应用程序的“主线”上运行。本身,活动或服务(或广播接收器,内容提供商等)是而不是的一个线程。看看文档,你会发现Activity和Service类实际上并不构成一个线程。相反,它们是将在Android框架内运行的钩子,并且该框架将在适当的时候在应用程序的“主”线程上调用它们。

您可以创建单独的应用程序线程,或使用AsyncTask来做工作并轻松地将其发布到UI线程(使用服务不那么容易实现)。

+0

谢谢。我知道活动和服务的定义,它们如何处理主线程,并且我可以在UI线程上创建单独的线程或'AsyncTask'。我想知道从“活动”或“服务”中获得的差异。 – mparaz

+1

@mparaz关于他们如何处理,他们应该没有什么不同。也就是说,在一个服务中启动一个线程将不会以与在一个活动中不同的方式处理。 –

1

绑定到活动的线程具有相同的生命周期。因此,如果您重新启动/终止活动,该线程也会重新启动/终止。如果您不管理活动的生命周期,这是一个问题。在这种情况下服务是很好的。您可以销毁活动,并且仍然有一个工作线程在后台运行(在服务中)。但请注意,如果Android系统需要资源(例如内存),它将首先终止服务(然后根据其Sticky标志重新启动它们)。在我看来,由于您控制了活动的工作流程,因此从活动更改为服务没有任何实际好处。如果线程很重(并且刹那间),可以考虑将它们放在一个单独的进程中的服务上(在AndroidManifest中放置服务的进程名称)。

在Android文档:

注意:使用工作者 线程在您的活动意外重新启动时,由于运行时 配置的变化可能会遇到(当用户更改屏幕如另一个问题 方向),这可能会破坏你的工作线程。要了解如何在这些重新启动过程中以及如何正确地取消任务时取消该任务,请参阅源代码 以了解Shelves示例应用程序。

+1

**所以如果您重新启动/终止活动,该线程也将被重新启动/终止。** - 是和否。例如,在屏幕方向改变的情况下,可以坚持一个'AsyncTask'并重新附加'Activity'。 – Squonk

+0

谢谢。你见过将线程移动到另一个进程的好处吗?我不明白这会如何改善它,并且我相信在单独的过程中运行会有开销。 – mparaz

+1

我已经看到很大的CPU/IO线程(解析15MB的XML和写入数据库)的好处。 – oxygenpt

相关问题