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

Spu*_*aba 145 android android-service android-asynctask java-threads

Service,Async Task&Thread之间有什么区别.如果我没有错,他们都习惯在后台做一些事情.那么,如何决定使用哪个以及何时使用?

Pen*_*m10 183

可能你已经阅读了关于它们的文档描述,我不会重复它们,而是我会尝试用自己的话来回答,希望它们会帮助你.

  • 服务就像一个活动,但没有接口.例如,如果您想要获取天气,则不会为其创建空白活动,为此您将使用服务.

  • 线程是一个线程,可能你已经从其他部分知道了.您需要知道无法从线程更新UI.您需要使用Handler,但请进一步阅读.

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

我经常使用Services,AsyncTasks.线程较少,或根本没有,因为我可以用AsyncTask做几乎所有事情.

  • 你需要同时使用它们.您创建一个服务,并在其中使用AsyncTask. (15认同)
  • @ Pentium10:您经常可以使用IntentService而不是Service + AsyncTask (10认同)
  • 另外值得注意的是,默认情况下,Android服务在主(UI)线程上运行.如果您的服务需要在后台运行,则需要在单独的线程(或AsyncTask)中明确启动它.否则,它可能会中断UI响应并导致应用程序无响应错误.Android服务本质上是一种"隐形"和"微型"活动,不一定是"背景"工作者. (9认同)
  • 添加到上面的答案,AsyncTask经历了4个步骤onPreExecute(),onProgressUpdate(Progress ...)onPostExecute(Result),{在UI线程中运行},doInBackground(Params ...){在后台线程中运行}.由于它在UI线程中提供了3种方法,因此用户无需担心使用处理程序或回调来更新UI. (4认同)

Ale*_*ret 22

这是您问题的最简单答案

线

是与主线程"并行"运行的执行单元是一个重要的点,除了主线程之外,您无法从此处的任何线程更新UI组件.

的AsyncTask

是一个特殊的线程,它为您提供更新UI的帮助方法,所以基本上您可以更新UI甚至AsyncTask将在后台线程上运行.不需要明确地进行进程间通信处理.

服务

解决上面的问题,因为它与调用它的活动分开存在,所以它甚至可以在活动被销毁时继续运行,它在主线程中运行(小心ANR)使用后台服务(扩展IntentService它会自动创建工作线程)为了你).服务就像没有UI的活动,有利于长期任务

  • 在旋转设备时不会重新创建AyncTask,因为它与Activity生命周期方法不同步. (4认同)
  • 您在Activity生命周期钩子中创建AsyncTask,当您旋转手机时,Activity将被销毁并重新启动.AsyncTask的previus实例连接到您刚刚销毁的Activity,因此您将获得"强制关闭",但您还将看到AsynTask的新实例如何再次触发.您可以使用Fragments保留AsyncTask并在Fragment上设置setRetainInstance(true)来帮助您. (4认同)

Pet*_*iak 15

我希望有人在几天前告诉我的更多信息:

  • 您可以在"活动"和"服务"之间共享全局变量(如线程).
  • 只要存在活动或服务,您的应用程序及其所有全局变量就不会被删除.
  • 如果您的应用程序中有一个服务实例且操作系统需要资源,它首先会杀死您的活动,但只要有服务,操作系统就不会将您的应用程序与其全局变量一起消灭.

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


Abb*_*ath 9

简而言之,Service for time consuming tasks,AsyncTask for short-lived tasks,Thread是一个standard java construction用于线程的.