任何人都可以分享使用IntentService
而不是AsycTask
线程甚至服务和线程的真正优势是什么?
6 回答
意图服务 没有与主线程通信。在工作线程上运行。没有并行任务。所有请求都在单个工作线程上处理。
线程 自行运行。用于并行处理的多线程。
服务 在没有 UI 的主线程中运行。长时间运行的进程阻塞主线程。使用服务内的线程进行长时间运行的进程。
AsyncTask 长时间运行的进程与主线程通信。在工作线程中运行。
在决定在您的实现中使用哪一个之前,您必须知道每个的确切目的。
使用 IntentService 有几个主要优点。
- 易于实施。它只有一种方法需要覆盖
- 易于传递数据。您只需使用意图附加机制
- 在您的应用中随处可用。它在 manifest.xml 中注册
- 处理多个意图。这些被排队并按顺序执行。
- 自终止。当队列中的意图被处理后,服务停止。
综合起来,这些优势使得 IntentService 机制既方便又强大。
服务是一个应用程序组件,代表应用程序希望在不与用户交互的情况下执行更长时间运行的操作,或提供功能供其他应用程序使用。每个服务类必须在其包的 AndroidManifest.xml 中有相应的声明。可以使用 Context.startService() 和 Context.bindService() 启动服务。
请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要执行任何 CPU 密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该生成自己的线程来完成这项工作。更多信息可以在进程和线程中找到。IntentService 类可作为 Service 的标准实现使用,它有自己的线程来安排要完成的工作。
AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用线程框架。AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。
异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。异步任务由 3 个通用类型定义,称为 Params、Progress 和 Result,以及 4 个步骤,称为 onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute。
Service
即使用户没有与您的应用程序交互,也可以在后台运行。如果这是您的情况,请使用服务。如果Thread
您需要不在主线程中执行某些工作,而仅在用户与您的应用程序交互时使用。典型的例子是在你的活动运行时播放音乐,而不是你创建线程。AsyncTask
只是线程的辅助类。
服务在应用程序的主线程中运行,因此如果您正在执行一些阻塞操作,您仍然必须在服务中创建一个新线程,或者您使用IntentService
已经为您完成的线程。IntentService
只是一个带有工作线程的服务。
我看到很多关于常规服务而不是 IntentServices 的讨论。我现在正在研究差异,主要是归结为您是要并行运行一堆事情(AsyncTask)还是要产生一个具有队列的工作线程。AsyncTask 似乎与 Activity 相关联,而 IntentService 似乎独立于它运行。
如果您曾经在活动之间进行过捆绑并处理过回调系统,那么 IntentService 就会变得非常简单。随意谈论 AsyncTask
我的大多数设计都倾向于 IntentServices 的排队方面。如果您使用的资源主要与 UI 线程分开运行,并且希望避免像单线程 CPU 这样对资源造成冲击,这将特别好。
使用意图,您可以调整应用的用户体验或要求其他应用执行常见操作:拍照、发送电子邮件和 SMS 消息,甚至在地图上显示位置和播放媒体。本课程将教您利用 Android 的这一核心功能所需了解的所有知识。