AsyncTask
和IntentService
。然而,我仍然不确定该使用哪种方法。我的应用程序基本上是一个带有Google Maps的位置/路径查找器。我的互联网连接将用于在地图半径内查找最近的路径。因此,每当用户移动或滑动地图到新位置时,它将更新最近的路径。它还将添加新路径,并允许用户评价路径。对于这个问题,
AsyncTask
是否足够,或者我应该使用IntentService
?AsyncTask
和IntentService
。然而,我仍然不确定该使用哪种方法。我的应用程序基本上是一个带有Google Maps的位置/路径查找器。我的互联网连接将用于在地图半径内查找最近的路径。因此,每当用户移动或滑动地图到新位置时,它将更新最近的路径。它还将添加新路径,并允许用户评价路径。AsyncTask
是否足够,或者我应该使用IntentService
?AsyncTask
是一个方便的线程工具,可以根据需要不断告知用户某些信息或定期在主线程上执行操作。它提供了很多细粒度控制,并且由于其性质,在Activity
中非常易于使用,而IntentService
通常需要使用BroadcastReceiver
或IBinder
框架。请注意保留HTML标签。
IntentService
可以像AsyncTask
一样使用,但它的目的是用于后台下载、上传或其他不需要用户交互或主线程的阻塞操作。例如,如果您想下载和缓存地图,您可能希望调用一个IntentService
,这样用户就不必在应用程序中查看它进行下载。同样,如果您要向服务器发送数据,IntentService
在这方面非常有帮助,因为您可以启动并忘记。用户可以在您的应用程序中输入评论,然后按“发送”。 “发送”将启动IntentService
,该服务获取评论并在后台线程上将其发送到您的服务器。用户可以立即离开应用程序,评论最终仍将到达您的服务器(当然,假设没有错误)。另一方面,在您的Activity
中使用AsyncTask
进行此操作时,系统可能会在交换过程中杀死您的进程,这可能会导致交换成功或失败。
通常来说,它们都不适用于长时间运行的应用程序。它们适用于短暂的一次性操作。虽然它们可以用于永久或长时间运行的操作,但并不推荐这样做。
如果您正在进行与活动紧密相关的短期重复任务,建议使用AsyncTask
。而IntentService
更适用于应在后台独立运行的计划任务(无论是否重复)。
AsyncTask 不太适合配置更改或其他重新启动 Activity 的情况。
IntentService 适用于应该始终可用的某些内容,无论其工作需要多长时间。在大多数情况下,我更喜欢 IntentService,因为 AsyncTask 更依赖于 Activity 状态。
一些注意事项:
在尝试更新位置之前,请不要忘记检查连接性。
AsyncTask
将解决您的问题。但要记住,AsyncTask
有一个重要的弱点:它无法很好地处理Activity
的“刷新”(例如在旋转期间)。如果用户在您的AsyncTask
仍在加载内容时旋转手机,则可能会出现问题。如果这确实是对您造成问题的情况,我建议使用AsyncTaskLoader
:http://developer.android.com/reference/android/content/AsyncTaskLoader.html。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的AsyncTask
(因为会出现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 => 不需要新的实例,也不需要新的工作线程。
如果我们在下载文件A完成后发送意图来下载文件B呢?下载文件A完成后,IntentService将被销毁(因为没有更多任务了)。因此,在开始下载文件B时,会创建一个新的Service
实例,但不会创建新的线程(服务仅使用在IntentSevice
构造函数中定义的名称的1个工作线程)。
2) 实现AsyncTask
比实现IntentService
更容易
使用
我们将看到AsyncTask
和IntentService
有许多相同之处,因此在大多数情况下,我们可以使用AsyncTask
或IntentService
。然而,
AsyncTask
来处理在一个Activity
中开始、结束和与UI交互的某些任务。IntentService
来处理可以从任何Activity
开始/结束并与UI交互或不与UI交互的某些任务。这个答案是基于我的测试。如果我有错误,请纠正我。希望它能帮助到你。
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
我同意@DeeV和@ebarrenechea的看法,即你应该将Intent Service用于与Activity不紧密绑定的任务,例如将一些数据上传到服务器或从服务器存储数据到数据库。
但是,从Android 3.0开始,引入了Loaders API,它应该替换AsyncTask。因此,例如加载列表以在Activity中显示更好使用Loader,它被设计为处理所有配置更改和Activity生命周期。