Java 何时使用服务、异步任务或处理程序?
有人能告诉我真正的区别吗?当你有需要在后台长时间运行的东西时,请使用服务。它不受任何活动的约束。典型的例子是音乐播放器。Java 何时使用服务、异步任务或处理程序?,java,android,service,handler,android-asynctask,Java,Android,Service,Handler,Android Asynctask,有人能告诉我真正的区别吗?当你有需要在后台长时间运行的东西时,请使用服务。它不受任何活动的约束。典型的例子是音乐播放器。 AsyncTask在当前活动中必须在后台完成某些工作时非常有用。例如,下载、搜索文件中的文本等 就我个人而言,我使用处理程序只是将更改发布到UI线程。例如,您在后台线程中进行一些计算,并通过处理程序发布结果 底线是:在大多数情况下,AsyncTask是您需要的。我的经验法则是,AsyncTask是指当我想做一些与单个活动相关的事情时,服务是指当我想做一些在活动启动后将在后台进
AsyncTask在当前活动中必须在后台完成某些工作时非常有用。例如,下载、搜索文件中的文本等
就我个人而言,我使用处理程序只是将更改发布到UI线程。例如,您在后台线程中进行一些计算,并通过处理程序发布结果
底线是:在大多数情况下,AsyncTask是您需要的。我的经验法则是,
AsyncTask
是指当我想做一些与单个活动相关的事情时,服务是指当我想做一些在活动启动后将在后台进行的事情时
因此,如果我想在活动
中进行少量后台处理而不占用UI,我将使用异步任务
。然后,我将使用该活动中的默认处理程序
来传递消息,以确保在主线程上进行更新。在主线程上处理更新有两个好处:UI更新发生正确,并且您不必太担心同步问题
例如,如果我想下载,可能需要一段时间,我会使用服务
。因此,如果我在我的应用程序中转到另一个活动
,或者完全转到另一个应用程序,我的服务
可以继续运行并继续下载文件,这样当我返回到我的应用程序时,它就可以准备好了。在这种情况下,我可能会在下载完成后使用一个应用程序,因此用户可以选择在方便的时候返回到我的应用程序
如果将AsyncTask
用于长时间运行的流程,您会发现,在您离开活动之后,它可能会继续运行,但是:
- 如果处理完成后,
活动
处于后台,则在尝试使用结果等更新UI时可能会出现问题
- 当Android需要内存时,后台
活动
比服务
更容易被Android杀死
为了补充关于服务和异步任务之间区别的其他答案,还值得注意[0]:
- 服务不是一个单独的进程。服务对象本身并不意味着它正在自己的进程中运行;除非另有规定,否则它与它所属的应用程序在同一进程中运行
- 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序不响应错误)李>
服务往往是描述应用程序重要部分的东西,而不是通常有助于活动和/或提高UI响应能力的异步任务。除了提高代码清晰度,服务还可以与其他应用程序共享,在应用程序和外部世界之间提供清晰的接口
我想说的不是一本书,而是《开发者指南》有很多很好的答案
[0]来源:
- AsyncTask:当我希望在不挂起UI的情况下执行某些操作时&反映UI中的更改李>
例如:点击按钮下载内容,保持在同一活动中并显示进度条/搜索栏以更新下载百分比。如果活动进入后台,则存在冲突的可能性
- 服务:当我想在后台做一些不需要更新UI的事情时,请使用服务。它不在乎应用程序是在前台还是后台
例如:当从Android Market下载的任何应用程序在状态栏中显示通知时,UI将返回到上一页并允许您执行其他操作。服务
服务是一种应用程序组件,它可以在后台执行长时间运行的操作,并且不提供用户界面。另一个应用程序组件可以启动服务,即使用户切换到另一个应用程序,它也将继续在后台运行。此外,组件可以绑定到要与之交互的服务
何时使用?
任务没有UI,但不应该太长。使用服务中的线程执行长任务。
总的来说,任务很长
触发器:调用onStartService()方法
从以下位置触发:任何线程
在其宿主进程的主线程上运行。服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)
限制/缺点:可能会阻塞主线程
异步任务
AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布
何时使用?
必须与主线程通信的小任务
对于并行任务,请使用多个实例或执行器
可能需要几毫秒以上时间的磁盘绑定任务
触发器:调用方法execute()
触发自:主线程
运行于:工作线程。但是,在这两种方法之间可以调用主线程方法来发布进度
限制/缺点:
- 一个实例只能执行一次(因此不能在循环中运行)
- 必须