任何人都可以分享使用IntentService
代替AsycTask
或线程甚至服务和线程的真正优势吗?
答案 0 :(得分:4)
意图服务 没有与主线程通信。在工作线程上运行。没有并行任务。所有请求都在一个工作线程上处理。
<强>发强> 独自运行。用于并行处理的多线程。
<强>服务强> 在没有UI的主线程中运行。长时间运行的进程块主线程。在长期运行过程中使用线程内部服务。
<强>的AsyncTask 强> 长时间运行的进程返回主线程。在工作线程中运行。
在决定在实施中使用哪一个之前,您必须知道每个的确切目的。
答案 1 :(得分:4)
使用IntentService有几个主要优点。
结合起来,这些优势使IntentService机制既方便又强大。
答案 2 :(得分:2)
服务是一种应用程序组件,表示应用程序希望在不与用户交互的情况下执行较长时间运行的操作,或者为其他应用程序提供要使用的功能。每个服务类必须在其包的AndroidManifest.xml中具有相应的声明。可以使用Context.startService()和Context.bindService()启动服务。
请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何CPU密集型(例如MP3播放)或阻止(例如网络)操作,它应该生成自己的线程来执行该工作。有关此内容的更多信息,请参见进程和线程。 IntentService类可用作Service的标准实现,它具有自己的线程,用于调度其工作。
AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。
答案 3 :(得分:0)
Service
也可以在后台运行。如果这是您的方案,请使用服务。如果您需要执行一些不在主线程中的工作,请使用Thread
,但仅限于用户与您的应用程序交互时。典型的例子是在您的活动运行时播放音乐,而不是创建线程。 AsyncTask
只是线程的辅助类。
服务正在应用程序的主线程中运行,因此如果您正在执行某些阻止操作,您仍然需要在服务中创建新线程,或者使用已经为您执行此操作的IntentService
。 IntentService
只是一个有工作线程的服务。
答案 4 :(得分:0)
我看到很多关于常规服务而不是IntentServices的讨论。我现在正在研究差异,而且大多数情况下,似乎可以归结为是否要并行运行一堆事物(AsyncTask),或者是否要生成具有队列的工作线程。 AsyncTask似乎与Activity绑定,而IntentService似乎独立于它运行。
如果你曾经在活动之间做过捆绑并处理过回调系统,那么IntentService就变得非常简单了。随意谈谈AsyncTask
我的大多数设计都倾向于喜欢IntentServices的排队方面。如果您正在使用一个主要与UI线程分开运行的资源,并且希望避免像单线程CPU那样锤击资源,那么这一点尤其好。