我应该使用AsyncTask还是IntentService?

我一直在阅读与Android的互联网连接,并注意到有不同的方式来处理这个,即AsyncTask和IntentService。 不过,我仍然不确定使用哪一个。 我的应用程序基本上是一个谷歌地图的位置/path查找器。 我的互联网连接将用于在地图的特定半径内查找最近的路线。 所以,每当用户移动或滑动地图到一个新的位置,那么它将更新与最近的path。 它也将添加一个新的线索,并允许用户评分线索。

将AsyncTask足够这个或我应该使用IntentService?

您应该使用AsyncTask来完成与活动紧密结合的短期重复性任务,例如您目前正在尝试执行的任务。 IntentService更适合于应该在后台运行的计划任务(重复或不重复),与您的活动无关。

他们可以用于不同的目的非常不同。

AsyncTask是一个方便的线程实用程序,如果您需要不断地告诉用户某些东西或定期在主线程上执行操作,可以使用它。 它提供了很多的细粒度控制,而且由于它的本质在Activity很容易处理,而IntentService通常需要使用BroadcastReceiver或者IBinder框架。

IntentService可以像AsyncTask一样使用,但是它的目的是为了后台下载,上传,或者其他不需要用户交互或主线程的阻塞操作。 例如,如果您想要下载和caching地图,则可能需要调用IntentService以便用户无需查看应用程序即可进行下载。 同样,如果您将数据发送到您的服务器, IntentService在这方面非常有用,因为您可以开始并忘记。 用户可以说,在您的应用程序中键入评​​论,然后按“发送”。 “发送”将启动IntentService获取评论,并在后台线程发送到您的服务器。 用户可以按“发送”,并立即离开应用程序,评论将最终仍然到达您的服务器(当然假设没有错误)。 如果你在Activity使用了AsyncTask ,那么系统可能会在交换过程中杀掉你的进程,并且可能会或者可能不会通过。

一般来说,对于长时间运行的应用程序, 它们意味着短暂的一次性操作。 他们可以用于永久或长时间的行动,但不build议。

AsyncTask在configuration更改或其他重新启动活动时不能很好地运行。

IntentService对于一个应该始终可用的东西是有好处的,无论其工作需要多长时间。 我更喜欢IntentService,因为AsyncTask更依赖于Activity的状态。

一些说明:

  • AsyncTask 适合于应该直接回到UI的快速任务,但可以在各种情况下使用。
  • 声明“定期对主线执行操作”含糊不清。 AsyncTask产生一个新的后台线程,这是不同于主线程,并在新线程上工作。 因此名称AsyncTask。
  • IntentService不需要“操纵”BroadcastReceiver框架。 所有你需要做的就是发送一个本地广播意图,并在你的活动中检测到它。 这是否比AsyncTask更难做,我不知道。
  • IntentService 为了执行长时间运行的任务,它在后台执行。
  • AsyncTaskLoader是可以使用的,但它是CursorLoader的基类,等等。如果你想在用户移动到新位置时刷新“附近”的path,IntentService可能会更好。

在尝试更新位置之前,不要忘记检查连接性。

AsyncTasks与Activity紧密相连,如果远离创buildAsyncTask的Activity,则通常会导致泄漏的窗口错误。 但是,由于可以快速更新进度百分比,因此它们显示ProgressBar非常棒。

意向服务更清洁,更安全。 当你是初学者的Android开发者时,他们更难以实现,但是一旦你学会了如何开始他们并处理他们,你将永远不会回到AsyncTasks!

意图服务还允许在您的应用程序更模块化的devise。 我通常为我所有的IntentServices创build一个单独的类,但对于AsyncTasks,我将它们创build为一个Activity内部类。 如果我从一个Activity中分离出一个AsyncTask,我将不得不在AsyncTask的构造函数中传入活动上下文和视图对象。

如上所述, AsyncTask将解决您的问题。

但请记住, AsyncTask有一个重要的弱点:它不能很好地处理Activity “刷新”(例如在轮换期间)。 这可能是一个问题,例如,如果您的AsyncTask仍在加载内容的用户旋转手机。 如果这确实是你的问题,我推荐AsyncTaskLoader

http://developer.android.com/reference/android/content/AsyncTaskLoader.html

我同意@DeeV和@ebarrenechea关于Intent服务的一部分,您应该将它用于与Activity不紧密绑定的任务,如将一些数据上传到服务器或将数据从服务器存储到数据库。

但从Android 3.0开始,引入了Loaders API,它应该替代AsyncTask。 因此,例如对于您应该显示在Activity中的加载列表,最好使用专门用于处理所有configuration更改和活动生命周期的Loader。

沃格拉装载机教程