Android:AsyncTask vs Service

eri*_*ork 135 android

为什么我在这里阅读大部分关于AsyncTask和装载机的大多数问题的答案,但没有关于服务的内容?服务不是很清楚,还是被弃用或有一些不良属性?有什么区别?

(顺便说一下,我知道还有其他线索,但没有一个真正说明明显的差异,这有助于开发人员轻松决定他是否最好使用这一个或另一个来解决实际问题.)

Com*_*ish 269

在某些情况下,可以用一个AsyncTask或一个来完成相同的任务,Service但是通常一个任务比另一个更适合任务.

AsyncTasks设计用于无法运行UI线程的一次性耗时任务.一个常见的例子是在按下按钮时获取/处理数据.

Services旨在持续在后台运行.在上面按下按钮时获取数据的示例中,您可以启动服务,让它获取数据,然后停止它,但这是低效的.使用一次AsyncTask运行,返回数据并完成的速度要快得多.

但是,如果你需要在后台持续做一些事情,那么Service你最好的选择.这方面的例子包括播放音乐,不断检查新数据等.

此外,正如谢里夫已经说过的那样,服务并不一定会脱离UI线程.

在大多数情况下,Service即使您的应用程序Activity未打开,s也适用于您希望运行代码的时间.AsyncTasks旨在使UI线程执行代码非常简单.

  • 最后一段,"即使您的应用程序的活动未打开,服务也适用于您希望运行代码的时间".AsyncTask或后台线程也是如此.即,当您按下活动或调用finish()并且您的活动不可见时,但您的后台线程仍在执行,直到您终止应用程序进程(例如,通过交换最近的任务).我用4.4.2谷歌Nexus AOSP石斑鱼检查过这个 (10认同)
  • 但是,如果启动它的Activity在AsyncTask仍在运行时被杀死,并且一旦完成就需要更新UI,那么AsyncTask可能会很棘手......(由于Activity已被销毁,这将无法工作).为什么不使用一个不需要手动停止的IntentService,因为它只是在完成后结束? (10认同)
  • @LarsH如果我错了,请纠正我,但我认为你可以在你的Activity/Fragment中使用BroadcastReceiver,而在IntentService中你只需在完成后激活一个广播.因为您可以重新注册活动/片段重新创建的广播,这应该包括你.另一种选择是使用EventBus来更新UI(尽管我试图避免这些 - 使代码更难以遵循imo). (3认同)
  • 有趣的是,在2010年Google I/O的讨论中,http://www.youtube.com/watch?v = xHXn3Kg2IQE,演示者提供了3种不同的方法,用于从REST API获取数据,第一种方法使用服务.我不是Android专家,但我也认为Computerish所说的基本上是正确的. (2认同)

She*_*tib 57

服务完全不同:服务不是线程!

您的Activity绑定到服务,并且该服务包含一些函数,这些函数在调用时会阻塞调用线程.您的服务可能用于将温度从摄氏度更改为度数.任何绑定的活动都可以获得此服务.


但是AsyncTask,一个Thread在后台执行一些工作,同时能够将结果报告回调用线程.

只是一个想法:服务可能有一个AsyncTask对象!

  • 服务被描述为在后台运行,即使你的应用程序关闭也会继续.AsyncTask也用于在后台执行某些操作.明白我的意思了吗? (2认同)

arj*_*jun 7

Service是Android框架的一个组件,它不需要执行UI,这意味着即使用户没有主动使用该应用程序,您也可以使用服务执行某些操作.这并不意味着服务将在单独的线程中运行,但它在主线程中运行,并且可以在需要时在单独的线程中执行操作.示例用法是在后台播放音乐,在没有用户交互的情况下在背景中与服务器同步数据等

AsyncTask另一方面,用于在单独的线程上执行UI阻塞任务.它与创建新线程和执行任务相同,当创建和维护线程并将结果发送回主线程的所有任务都由AsyncTask处理时.示例用法是从服务器获取数据,在内容解析器上获取CRUD操作等

  • 其他答案要么太短,要么太长,以免初学者理解.所以我用简单的例子用例子来回答 (2认同)

log*_*cat 6

服务是守护进程,AsynkTask是后台线程

  • 服务不是守护进程,因为它没有自己的执行线程. (32认同)
  • IntentService有 (5认同)

Ash*_*kol 6

服务asynctasks几乎做同样的事情,差不多.采用服务或的AsyncTask取决于你的需求是什么.

例如,如果你想在点击某个按钮或更改屏幕后从服务器将数据加载到listview,你最好使用asynctask.it与主ui线程并行运行(在后台运行).对于运行asynctack活动或你的应用程序应该在主UI线程上.从应用程序退出后,没有asynctask.

但服务不是那样的,一旦你启动一个服务,它就可以在你退出应用程序后运行,除非你停止服务.我说这取决于你的要求.如果你想继续检查数据接收或检查网络状态你最好还是继续服务.

快乐的编码.

  • 你知道答案已经给出了,如果我在这里给出正确答案或我的意见,我在这里看不到太多问题?因为你并不是唯一一个寻找同一问题答案的人,如果有人难以理解上述答案中的解决方案,他/她可以向下滚动以寻找适合他们的答案,轻松理解一个.这就是它.感谢评论兄弟,我不是天才或专业编程,只想帮助别人,尝试教别人我已经知道的:) (3认同)