服务,asynchronous任务和线程之间的区别?

Service,Async Task&Thread有什么区别? 如果我没有错,他们都是用来做背景的东西。 那么,如何决定使用哪个以及何时使用?

大概你已经阅读了关于他们的文档描述,我不会重复他们,相反我会试着用我自己的话来回答,希望他们会帮助你。

  • 服务就像一个活动,但没有接口。 也许如果你想获取天气,例如你不会创build一个空白的活动,为此,你将使用一个服务。

  • 一个线程是一个线程,可能你已经从其他部分知道它。 您需要知道您无法从线程更新UI。 您需要使用一个处理程序,但进一步阅读。

  • AsyncTask是一个智能线程,build议使用。 智能,因为它可以帮助它的方法,有三种方法在UI线程上运行,这是很好的更新UI组件。

我经常使用服务,AsyncTasks。 线程less,或者根本不用,因为我几乎可以用AsyncTask完成所有的事情。

这是你的问题最简单的答案

线

是一个执行单元,对主线程运行“并行”是非常重要的,因为在这里主线程不能更新UI组件。

的AsyncTask

是为了一个简短的任务,因为绑定到主机活动 ,例如,如果您创build一个AsyncTask谁将从服务器拉动数据(不这样做),当你旋转手机和活动再次重新创build的AsyncTask也重新创build

服务

解决了上述问题,因为它与活动分开居住,因此即使在活动被销毁时它也可以继续运行, 它在主线程中运行(当心ANR)使用后台服务(扩展IntedService它会自动创build工作线程为你)服务就像一个没有UI的活动 ,对于长时间的任务来说是很好的

我希望有人在几天前告诉我:

  • 您可以在活动和服务之间共享全局variables,例如线程。
  • 只要活动或服务仍然存在,您的应用程序及其所有全局variables将不会被清除。
  • 如果您的应用程序中有服务实例,并且操作系统需要资源,则首先会杀死您的活动,但只要存在服务,操作系统就不会将您的应用程序与其全局variables一起清除。

我的用例是这样的:我在全局空间中有一个连接到服务器的线程和一个显示结果的Activity。 当用户按下主页button时,活动进入后台并启动一个新的服务。 然后,该服务从线程读取结果,并在需要时在通知区域中显示信息。 我不担心操作系统破坏我的Activity,因为我知道只要Service正在运行,它就不会销毁这个线程。

线

线程是一个并发的执行单元。 它有自己的调用堆栈。 有两种方法可以在应用程序中实现线程。

一个是提供一个扩展Thread并覆盖run()方法的新类。 另一个是在创build过程中提供一个带有Runnable对象的新的Thread实例。 一个线程可以通过调用其“开始”方法来执行。 您可以通过调用其“setPriority(int)”方法来设置线程的“优先级”。

如果您在UI部分中没有任何影响,则可以使用线程。 例如,您正在调用一些Web服务或下载一些数据,下载后,您将显示在屏幕上。 然后,您需要使用一个带有线程的处理程序,这将使您的应用程序变得复杂,以处理来自线程的所有响应。

处理程序允许您发送和处理与线程的MessageQueue关联的消息和可运行对象。 每个线程都有每个消息队列。 (就像一个待办事项列表),线程将采取每个消息并进行处理,直到消息队列为空。 所以,当处理程序通信时,它只是给调用者线程一个消息,它将等待处理。

如果使用Java线程,则需要在自己的代码中处理以下要求:

  • 如果将结果回发到用户界面,则与主线程同步无取消线程的默认值无默认线程池在Android中处理configuration更改时没有默认值

的AsyncTask

AsyncTask支持正确和简单地使用UI线程。 这个类允许在UI线程上执行后台操作和发布结果,而无需操作线程和/或处理程序。 asynchronous任务由在后台线程上运行的计算来定义,并且其结果在UI线程上发布。

AsyncTask将经历以下4个阶段:

onPreExecute()

执行任务之前在UI线程上调用

doInbackground(PARAMS ..)

onPreExecute()完成执行后立即在后台线程上调用。

onProgressUpdate(进步..)

调用publishProgress(Progress …)后,在UI线程上调用。

onPostExecute(结果)

后台计算完成后在UI线程上调用。
为什么你应该使用AsyncTask?

易于使用的UI线程。 (所以,当调用者线程是一个UI线程时使用它)。 不需要操作Handlers。

服务 “服务”与“活动”类似,但没有GUI。

重要提示 :服务不会在新线程中运行!

阅读有关服务 ,并检查如何总是在后台运行服务

简而言之,为time consuming tasks 服务 ,针对short-lived tasks time consuming tasks AsyncTaskThread线程standard java construction

从开发者的angular度来看:

线程 :用于执行设置为与主线程并行编码。 但是你不能处理线程内的UI。 为此你需要使用Handler 。 哈德勒像线程一样工作,但也可以处理UI。

ASyncTask :用于处理那些不能在主线程上工作的任务。 例如,一个HTTP请求是非常繁重的工作,不能在主线程上处理,所以你在ASyncTask处理HTTP请求。它与你的主线程在后台asynchronous工作并行。它有很less的callback方法调用他们的相应的事件。

服务 :是一个后台进程。 当你必须做一些没有任何UI关联的处理时,它被使用。

服务就像活动耗费时间的任务,但asynchronous任务允许我们执行长/后台操作,并在UI线程上显示其结果,而无需操纵线程。