我一直在阅读有关Android的互联网连接,并注意到有不同的方法可以解决这个问题,即AsyncTask
和IntentService
。但是,我仍然不确定使用哪一个。我的应用程序基本上是一个位置/路径查找器与谷歌地图。我的互联网连接将用于查找地图某个半径范围内最近的路径。因此,每次用户将地图移动或滑动到新位置时,它都会使用最近的路径进行更新。它还将添加新的路径,并允许用户对路径进行评级。
AsyncTask
是否足够,或者我应该使用IntentService
?
答案 0 :(得分:55)
它们可以用于不同目的。
AsyncTask
是一个方便的线程实用程序,如果您需要经常告诉用户某些内容或定期在主线程上执行操作,可以使用它。它提供了很多细粒度控制,因为它的性质很容易在Activity
中使用,而IntentService
通常需要使用BroadcastReceiver
或IBinder
框架。
IntentService
可以像AsyncTask
一样使用,但它的目的是用于后台下载,上传或其他不需要用户交互或主线程的阻止操作。例如,如果要下载和缓存地图,可能需要调用IntentService
,以便用户无需查看应用程序即可下载。同样,如果您要向服务器发送数据,IntentService
在这方面非常有用,因为您可以开始忘记。例如,用户可以在您的应用中键入注释,然后按“发送”。 “发送”将启动IntentService
获取评论并在后台线程上将其发送到您的服务器。用户可以按“发送”并立即离开应用程序,评论最终仍会到达您的服务器(当然假设没有错误)。如果您在AsyncTask
中使用Activity
执行此操作,系统可能会在您的交易过程中终止您的流程,而且可能或可能不会通过。
一般来说,两者都不适用于长时间运行的应用程序。它们意味着短暂的一次性操作。它们可以用于永久性或长期运行,但不建议这样做。
答案 1 :(得分:48)
对于与活动紧密绑定的短重复任务,您应该使用AsyncTask
,就像您目前正在尝试的那样。 IntentService
更适合应在后台运行的计划任务(重复或不重复),与您的活动无关。
答案 2 :(得分:21)
AsyncTask不能很好地配置更改或重新启动Activity的其他内容。
IntentService适用于应始终可用的内容,无论执行其工作所需的时间长短。在大多数情况下,我更喜欢IntentService,因为AsyncTask更加依赖于Activity状态。
一些注意事项:
在尝试更新位置之前,请不要忘记检查连接性。
答案 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)
AsyncTask
和IntentService
有许多相同的
AsyncTask
,我们经常使用onProgressUpdate
,onPostExecute
,或者如果您愿意,可以使用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)实施AsyncTask
比IntentService
是强>
我们会看到AsyncTask
和IntentService
有很多相同,所以在大多数情况下我们可以使用AsyncTask
或IntentService
。然而
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,它旨在很好地处理所有配置更改和活动生命周期。