服务,异步任务和线程之间的区别?


Answers:


186

可能您已经阅读了有关它们的文档描述,所以我不再赘述,相反,我将尝试用自己的话回答,希望它们对您有所帮助。

  • 服务就像一个活动,但没有用户界面。例如,如果您想获取天气,则可能不会为此创建空白活动,为此您将使用“服务”。

  • 线程是线程,可能您已经从其他部分了解它。您需要知道您无法从线程更新UI。您需要为此使用Handler,但请进一步阅读。

  • AsyncTask是建议使用的智能线程。智能是因为它可以帮助实现其方法,并且有三种方法在UI线程上运行,这对于更新UI组件非常有用。

我经常使用服务,AsyncTasks。线程更少或根本不线程,因为我几乎可以使用AsyncTask进行所有操作。


1
感谢您的解释。因此,如果我需要制作一个从Web上获取数据的应用程序,那将是更好的选择服务或异步任务?
SpunkerBaba 2010年

16
您需要同时使用两者。您创建一个服务,并在其中使用AsyncTask。
Pentium10'7

4
添加到上述答案中,AsyncTask经过4个步骤onPreExecute(),onProgressUpdate(Progress ...)onPostExecute(Result),{在UI线程中运行},doInBackground(Params ...){在后台线程中运行}。由于它在UI线程中提供3种方法,因此用户不必担心使用处理程序或回调来更新UI。
SpunkerBaba 2010年

11
@ Pentium10:通常可以使用IntentService代替Service + AsyncTask
njzk2

11
同样值得注意的是,默认情况下,Android服务在主(UI)线程上运行。如果您的服务需要在后台运行,则需要在单独的线程(或AsyncTask)中显式启动它。否则,可能会冒中断UI响应性的风险,并引发Application Not Responding错误。Android的服务本质上是“隐形”和“微型”活动,不一定是“后台”工作者。
CCJ 2013年

23

这是您问题的最简单答案

线

是一个与主线程“并行”运行的执行单元是很重要的一点,您不能从此处的任何线程(主线程除外)更新UI组件。

异步任务

是一个特殊的线程,它为您提供了用于更新UI的辅助方法,因此,基本上,即使AsyncTask将在后台线程上运行,您也可以更新UI。不需要明确进行进程间通信处理。

服务

解决上述问题,因为它与调用它的活动是分开存在的,因此即使活动被破坏,也可以继续运行,它在主线程(请注意ANR)中运行,使用后台服务(扩展IntentService,它会自动创建工作线程)为您)服务就像没有UI的活动,对长期任务很有用


4
旋转设备时不会重新创建AyncTask,因为它与Activity生命周期方法不同步。
CopsOnRoad

4
您可以在“活动”生命周期挂钩中创建AsyncTask,并在旋转手机时销毁并重新启动“活动”。先前的AsyncTask实例连接到您刚刚销毁的Activity,因此,您将获得“强制关闭”,但您还将看到AsynTask的新实例如何再次触发。您可以使用Fragments保留AsyncTask并在Fragment上设置setRetainInstance(true),这将对您有所帮助。
亚历杭德罗·塞雷特

15

我希望几天前有人告诉我更多信息:

  • 您可以在“活动”和“服务”之间共享全局变量(例如线程)。
  • 只要仍然存在活动或服务,您的应用程序及其所有全局变量都不会被清除。
  • 如果您的应用程序中有一个Service实例,并且OS需要资源,则它首先会杀死您的Activity,但是只要有Service,OS就不会将您的应用程序及其全局变量一起清除掉。

我的用例是这样的:我在全局空间中有一个线程连接到服务器,并且有一个Activity显示结果。当用户按下主页按钮时,活动将进入后台并启动新的服务。然后,该服务从线程读取结果,并在需要时在通知区域中显示信息。我不必担心操作系统会破坏我的活动,因为我知道只要服务运行,它就不会破坏线程。


9

简而言之,Service for time consuming tasksAsyncTask for short-lived tasksThreadstandard java constructionfor线程。


3

从开发人员的角度来看:

线程:用于执行与主线程并行的代码集。但是您无法处理线程内的UI。为此,您需要使用Handler。Hadler的工作方式类似于线程,但也可以处理UI。

ASyncTask:用于处理无法在主线程上执行的那些任务。例如,一个HTTP请求是非常繁重的工作,无法在主线程上处理,因此您可以在后台处理HTTP请求。ASyncTask它在后台与您的主线程异步并行工作。事件。

服务:是一个后台进程。当您必须执行没有任何UI关联的处理时,可以使用它。


1
Service除非您使用,否则不需要在后台运行IntentService。如果您Service从UiThread 启动标准,它将在UiThread上运行。
yshahak

@yshahak您是正确的,但是在这里我们不需要深入的定义。用户只想知道它们之间的区别。
拉胡尔·雷纳

是的,但这并不准确,因为Service默认情况下不会在其他进程中运行,而是与其他组件一起在应用程序进程中运行。最好说这Service将在其内部的线程后台运行。
yshahak

以上三项在申请过程中均有效。ASyncTask的preExecute()和postExecute()方法适用于UIThread,而doInBackground()和onProgress()适用于后台线程。服务在后台线程上工作,而线程也在后台线程上工作。但是,Handler可以在UI Thread上工作。
拉胡尔·雷纳

2

服务就像活动耗时的任务,但异步任务使我们可以执行长时间/后台操作并在UI线程上显示其结果,而无需操纵线程。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.