Can someone tell me the TRUE difference?
5 回答
我的经验法则是,AsyncTask
当我想做一些与单人相关Activity
的事情Service
时,当我想做一些事情时,当我想做一些在后台启动它的活动之后会继续的事情时。
因此,如果我想在不绑定 UI 的情况下进行少量后台处理,Activity
我将使用AsyncTask
. 然后,我将使用其中的默认值Handler
来Activity
传递消息,以确保在主线程上发生更新。在主线程上处理更新有两个好处: UI 更新正确发生,您不必太担心同步问题。
例如,如果我想做一个可能需要一段时间的下载,我会使用Service
. 因此,如果我转到Activity
我的应用程序中的另一个或另一个应用程序,我Service
可以继续运行并继续下载文件,这样当我返回我的应用程序时它就准备好了。在这种情况下,一旦下载完成,我可能会使用状态栏通知,因此用户可以选择在方便时返回我的应用程序。
如果您将 anAsyncTask
用于长时间运行的过程,您会发现它可能会在您离开Activity
但之后继续:
- 如果
Activity
处理完成时它在后台,则在尝试使用结果更新 UI 时可能会遇到问题等。 - 在需要内存时,背景
Activity
比Service
.
Use Service when you've got something that has to be running in the background for extended periods of time. It's not bound to any activity. The canonical example is a music player.
AsyncTask is great when some stuff has to be done in background while in the current activity. E.g. downloading, searching for text inside a file, etc.
Personally I use Handlers only to post changes to the UI thread. E.g. you do some computations in a background thread and post the result via handler.
The bottom line: in most cases, AsyncTask is what you need.
为了补充这里关于服务和 AsyncTask 之间区别的其他答案,还值得注意[0]:
- 服务不是一个单独的进程。Service 对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它在与其所属的应用程序相同的进程中运行。
- 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序无响应错误)。
服务往往是描述应用程序重要部分的东西 - 而不是通常有助于 Activity 和/或改善 UI 响应能力的 AsyncTask。除了提高代码清晰度服务还可以与其他应用程序共享,在您的应用程序和外部世界之间提供清晰的接口。
而不是一本书,我会说开发人员指南有很多很好的答案。
[0] 来源:http: //developer.android.com/reference/android/app/Service.html#WhatIsAService
- AsyncTask:当我希望在不挂起 UI 的情况下做某事并反映 UI 中的更改。
例如:在按钮单击上下载某些内容,保持在相同的活动中并显示进度条/搜索栏以更新下载的百分比。如果Activity进入后台,就有可能发生冲突。
- 服务:当我希望在后台做一些不需要更新 UI 的事情时,使用服务。它不关心应用程序是在前台还是后台。
例如:当从 Android Market 下载的任何应用程序在状态栏中显示通知并且 UI 返回上一页并让您执行其他操作时。
服务
Service 是一个应用程序组件,可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动一个服务,即使用户切换到另一个应用程序,它也会继续在后台运行。此外,组件可以绑定到要与之交互的服务。
什么时候使用?
没有 UI 的任务,但不应该太长。在服务中使用线程来处理长任务。任务一般很长。
触发器:调用方法 onStartService()
触发自:任何线程
运行于:其宿主进程的主线程。该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)
限制/缺点:可能会阻塞主线程
异步任务
AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。
什么时候使用?
必须与主线程通信的小任务对于并行任务使用多个实例或执行器可能需要超过几毫秒的磁盘绑定任务
触发器:调用方法execute()
触发自:主线程
运行于:工作线程。但是,可以在两者之间调用主线程方法来发布进度。
限制/缺点:
- 一个实例只能执行一次(因此不能循环运行)
- 必须从主线程创建和执行
参考链接