从Activity
和Service
开始的Activity
运行后台话题是否有任何区别? 已添加:后台线程不与UI交互。
我目前有一些从Activity
启动的后台主题。大多数是通过AsyncTask
,一个是通过我自己的ExecutorService
。我想知道重构代码以将这些代码移到Service
或IntentService
是否有重大好处。
答案 0 :(得分:3)
您似乎对活动和服务的定义感到困惑。说清楚:
然而,这两个都在应用程序的“主线程”上运行。活动或服务(或广播接收器,内容提供商等)本身不一个线程。查看文档,您将看到Activity和Service类实际上不构成一个线程。相反,它们是将在Android框架内运行的钩子,框架将在适当的时候在应用程序的“主”线程上调用它们。
您可以为应用创建单独的线程,或者使用AsyncTask
进行工作并轻松地将其发布到UI线程(使用服务不太容易实现)。 / p>
答案 1 :(得分:1)
绑定到Activities的线程具有相同的生命周期。因此,如果重新启动/杀死Activity,线程也将重新启动/终止。如果您不管理活动的生命周期,则会出现此问题。在这种情况下,服务很好。您可以销毁活动,并且仍然可以在后台运行工作线程(在服务中)。但请注意,如果Android系统需要资源(例如内存),它将首先终止服务(然后根据Sticky标志重新启动它们)。在我看来,将线程从“活动”更改为“服务”没有实际的好处,因为您可以控制活动的工作流程。如果线程很重(并暂时停止UI),可以考虑将它们放在单独进程的服务中(在AndroidManifest中放置服务的进程名称)。
在Android文档中:
警告:使用工作人员时可能遇到的另一个问题 由于运行时,线程在您的活动中意外重启 配置更改(例如用户更改屏幕时) orientation),这可能会破坏你的工作线程。看看你怎么样 在其中一次重启期间以及如何正确地执行任务 销毁活动时取消任务,请参阅源代码 对于Shelves示例应用程序。