Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 何时使用服务、异步任务或处理程序?_Java_Android_Service_Handler_Android Asynctask - Fatal编程技术网

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()

触发自:主线程

运行于:工作线程。但是,在这两种方法之间可以调用主线程方法来发布进度

限制/缺点:

  • 一个实例只能执行一次(因此不能在循环中运行)
  • 必须