服务、异步任务和线程之间的区别?
Posted
技术标签:
【中文标题】服务、异步任务和线程之间的区别?【英文标题】:Difference between Service, Async Task & Thread? 【发布时间】:2011-03-16 21:59:21 【问题描述】:Service、Async Task 和 Thread 有什么区别。如果我没记错的话,他们都习惯于在后台做一些事情。那么,如何决定使用哪个以及何时使用?
【问题讨论】:
似乎还有一件人们经常会混淆的东西 - Loaders。相关线程 - Asynctask vs Thread vs Services vs Loader 【参考方案1】:可能您已经阅读了有关它们的文档描述,我不会重复它们,而是会尝试用我自己的话给出答案,希望它们对您有所帮助。
Service 类似于 Activity,但没有用户界面。例如,如果您想获取天气,您可能不会为其创建空白活动,为此您将使用服务。
一个线程就是一个线程,可能你已经从其他部分知道了。您需要知道您不能从线程更新 UI。您需要为此使用处理程序,但请进一步阅读。
AsyncTask 是建议使用的智能线程。智能,因为它可以帮助它的方法,并且在 UI 线程上运行了三个方法,这对更新 UI 组件很有好处。
我经常使用服务、AsyncTasks。线程更少,或者根本没有,因为我几乎可以用 AsyncTask 做所有事情。
【讨论】:
感谢您的解释。那么,如果我需要制作一个从 Web 获取数据的应用程序,哪个是更好的选择服务或异步任务? 您需要同时使用两者。您创建一个服务并在其中使用 AsyncTask。 添加到上面的答案,AsyncTask 经历了 4 个步骤 onPreExecute(),onProgressUpdate(Progress...)onPostExecute(Result),running in UI thread,doInBackground(Params...)running在后台线程。由于它在 UI 线程中提供了 3 种方法,用户无需担心使用处理程序或回调来更新 UI。 @Pentium10 : 你通常可以使用 IntentService 来代替 Service+AsyncTask 另外值得注意的是,默认情况下,android 服务在主 (UI) 线程上运行。如果您的服务需要在后台工作,则需要显式在单独的线程(或 AsyncTask)中启动它。否则,它可能会中断 UI 响应并引发 Application Not Responding 错误。 Android 服务本质上是一个“隐形”和“微型”活动,不一定是“后台”工作人员。【参考方案2】:这是您问题的最简单答案
线程
是一个与主线程“并行”运行的执行单元很重要的一点,除了主线程之外,您不能从这里的任何线程更新 UI 组件。
异步任务
是一个特殊的线程,它为您提供更新 UI 的辅助方法,因此基本上您可以更新 UI,即使 AsyncTask 将在后台线程上运行。不需要显式地完成进程间通信处理。
服务
解决上述问题,因为它与调用它的活动分开,因此即使活动被销毁,它也可以继续运行,它在主线程中运行(注意 ANR)使用后台服务(扩展 IntentService 它创建工作线程自动为你)。 服务就像没有 UI 的活动, 适合长时间的任务
【讨论】:
AyncTask 不会在旋转设备时重新创建,因为它与 Activity 生命周期方法不同步。 您在 Activity 生命周期挂钩中创建 AsyncTask,当您旋转手机时,Activity 被销毁并重新启动。 AsyncTask 的先前实例连接到您刚刚销毁的 Activity,因此您将获得“强制关闭”,但您还将看到 AsynTask 的新实例如何再次触发。您可以使用 Fragments 来保留 AsyncTask 并在 Fragment 上设置 setRetainInstance(true) 来帮助您。【参考方案3】:我希望几天前有人告诉我的更多信息:
您可以在活动和服务之间共享全局变量,例如线程。 只要 Activity 或 Service 仍然存在,您的应用程序及其所有全局变量就不会被清除。 如果您的应用程序中有一个 Service 的实例并且操作系统需要资源,它首先会杀死您的活动,但只要存在该服务,操作系统就不会清除您的应用程序及其全局变量。我的用例是这样的:我在全局空间中有一个连接到服务器的线程和一个显示结果的 Activity。当用户按下主页按钮时,Activity 进入后台并启动新的服务。然后,该服务从线程中读取结果,并在需要时在通知区域中显示信息。我不担心操作系统会破坏我的 Activity,因为我知道只要服务正在运行,它就会破坏线程。
【讨论】:
【参考方案4】:简而言之,Service 用于time consuming tasks
,AsyncTask 用于short-lived tasks
,Thread 是standard java construction
用于线程。
【讨论】:
【参考方案5】:从开发者的角度来看:
线程:用于与主线程并行执行集合代码。但是您无法处理线程内的 UI。为此,您需要使用Handler
。 Hadler
将线程 Runnable
与 Looper
绑定,使其成为 UI 线程。
ASyncTask:用于处理那些不能在主线程上工作的任务。例如,一个 HTTP 请求是一项非常繁重的工作,无法在主线程上处理,因此您在 ASyncTask
处理 HTTP 请求,它与您的主线程在后台异步并行工作。它有一些回调方法,它们在其相应的事件上被调用。
服务:在同一Application
进程下的后台工作。它是在您必须进行一些没有与之关联的 UI 的处理时实现的。
【讨论】:
Service
不需要在后台运行,除非您使用 IntentService
。如果您从 UiThread 启动标准 Service
,它将在 UiThread 上运行。
@yshahak 你是对的,但在这里我们不需要深入的定义。用户只想知道它们之间的区别。
是的,但这并不准确,因为Service
默认情况下不会在不同的进程中运行,而是在应用程序进程中与其他组件一起运行。最好说Service
将在它所在的线程的后台运行。
以上三项均在申请过程中工作。 ASyncTask 的 preExecute() 和 postExecute() 方法适用于 UIThread,doInBackground() 和 onProgress() 适用于后台线程。服务适用于后台线程,线程也适用于后台线程。但是 Handler 在 UI Thread 上工作。【参考方案6】:
服务类似于活动耗时的任务,但异步任务允许我们执行长/后台操作并在 UI 线程上显示其结果,而无需操作线程。
【讨论】:
以上是关于服务、异步任务和线程之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章