我应该为我的应用程序使用AsyncTask或IntentService吗?

时间:2013-03-01 21:26:38

标签: android google-maps android-asynctask intentservice

我一直在阅读有关Android的互联网连接,并注意到有不同的方法可以解决这个问题,即AsyncTaskIntentService。但是,我仍然不确定使用哪一个。我的应用程序基本上是一个位置/路径查找器与谷歌地图。我的互联网连接将用于查找地图某个半径范围内最近的路径。因此,每次用户将地图移动或滑动到新位置时,它都会使用最近的路径进行更新。它还将添加新的路径,并允许用户对路径进行评级。

AsyncTask是否足够,或者我应该使用IntentService

8 个答案:

答案 0 :(得分:55)

它们可以用于不同目的。

AsyncTask是一个方便的线程实用程序,如果您需要经常告诉用户某些内容或定期在主线程上执行操作,可以使用它。它提供了很多细粒度控制,因为它的性质很容易在Activity中使用,而IntentService通常需要使用BroadcastReceiverIBinder框架。

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

一般来说,两者都不适用于长时间运行的应用程序。它们意味着短暂的一次性操作。它们可以用于永久性或长期运行,但不建议这样做。

答案 1 :(得分:48)

对于与活动紧密绑定的短重复任务,您应该使用AsyncTask,就像您目前正在尝试的那样。 IntentService更适合应在后台运行的计划任务(重复或不重复),与您的活动无关。

答案 2 :(得分:21)

AsyncTask不能很好地配置更改或重新启动Activity的其他内容。

IntentService适用于应始终可用的内容,无论执行其工作所需的时间长短。在大多数情况下,我更喜欢IntentService,因为AsyncTask更加依赖于Activity状态。

一些注意事项:

  • AsyncTask best 用于快速完成任务,应该直接返回到用户界面,但它可以在各种情况下使用。
  • 声明“定期在主线程上执行操作”是模糊的。 AsyncTask生成一个新的后台线程,该线程主线程不同,并在新线程上运行。因此名称为AsyncTask。
  • IntentService不需要“操纵”BroadcastReceiver框架。您需要做的就是发送本地广播Intent,并在您的Activity中检测它。这是否比AsyncTask更难做,我不知道。
  • IntentService 意味着执行长时间运行的任务,它在后台执行。
  • AsyncTaskLoader可以使用,但它意味着是CursorLoader等的基类。 如果您想在用户移动到新位置时刷新“附近”路径,则IntentService可能更好。

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

答案 3 :(得分:8)

AsyncTasks与Activity绑定非常紧密,如果您离开创建AsyncTask的Activity,通常会导致泄露的窗口错误。但它们非常适合显示ProgressBar,因为您可以快速更新进度百分比。

IntentServices更清洁,更安全。当您是初学Android开发人员时,它们更难实现,但是一旦您学会了如何启动它们并处理它们,您可能永远不会回到AsyncTasks!

IntentServices还允许在您的应用中实现更加模块化的设计。我通常为我的所有IntentServices创建一个单独的类,但对于AsyncTasks,我将它们创建为Activity内部类。如果我要从Activity中分离出AsyncTask,我将不得不在AsyncTask构造函数中传递Activity Context和View对象,这可能很麻烦。

答案 4 :(得分:6)

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

但请记住AsyncTask有一个重要的弱点:它处理得不好Activity “刷新”(例如在旋转期间)。如果用户在AsyncTask仍在加载内容时旋转手机,则可能会出现问题。如果这确实是一个问题,我建议AsyncTaskLoader

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

答案 5 :(得分:3)

AsyncTaskIntentService有许多相同的

  • 可以在工作线程中执行任务
  • 可以在后台运行
  • 继续运行直到任务完成事件,启动它的活动被销毁
  • 可以在任务运行期间或任务完成后通知更新UI
    • 对于AsyncTask,我们经常使用onProgressUpdateonPostExecute,或者如果您愿意,可以使用BroadcastReceiver
    • 对于IntentService,我们使用BroadcastReceiver

不同的

1)运行时或运行完成后发送任务

示例我们的任务是:从fileName上的服务器下载文件。

使用 AsyncTask

如果我们是AsyncTask的一个实例,则在执行下载文件A期间,我们无法执行下载文件B AsyncTask(因为我们得到java.lang.IllegalStateException: Cannot execute task: the task is already running.)。下载文件A完成后,我们无法执行下载文件B(因为我们得到java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 要在下载文件A期间或之后下载文件B,我们需要创建AsyncTask的新实例 =>要下载文件A和文件B,我们需要2个AsyncTask =>实例创建了2个工作线程

使用 IntentService

在下载文件A期间,我们可以发送意图下载文件B =>下载文件A完成后,它将自动开始下载文件B =>不需要新的实例,不需要新的工作线程。

如果我们发送意图下载文件B 下载文件A完成后?下载文件A完成后, IntentSevice 将被销毁(因为没有更多的任务)。因此,当开始下载文件B时,会创建Service的新实例,但是没有创建新线程(服务仅使用1个工作线程,该名称在IntentSevice构造函数中定义

2)实施AsyncTaskIntentService

更容易


我们会看到AsyncTaskIntentService有很多相同,所以在大多数情况下我们可以使用AsyncTaskIntentService。然而

  • 我经常使用AsyncTask来完成一项启动,完成,与1 Activity中的用户界面交互的任务
  • 我经常使用IntentService来完成可以开始/结束并与任何Activity
  • 进行互动或不与用户界面互动的任务

这个答案是基于我的测试。如果我错了,请纠正我。希望它有所帮助。

答案 6 :(得分:0)

简而言之,AsyncTask适用于必须与主线程通信的简短任务。 IntentService用于不需要与主线程通信的长任务。

有关更多信息,请查看以下链接

http://www.onsandroid.com/2011/12/difference-between-android.html

https://medium.com/@skidanolegs/asynctask-vs-intentservice-1-example-without-code-5250bea6bdae

https://android.jlelse.eu/using-intentservice-vs-asynctask-in-android-2fec1b853ff4

答案 7 :(得分:-1)

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

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

Vogella loader tutorial