我不知道什么时候该使用AsyncTask,什么时候该使用Service。到目前为止,据我所知,如果需要更新图形用户界面,可以使用AsyncTask,可以使用Binder进行更复杂的交互,也可以用于与不同流程的交互
发布于 2014-04-15 22:33:07
来自AsyncTask文档的 -
AsyncTask被设计为围绕线程和处理程序的帮助器类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于较短的操作(最多几秒钟)。如果您需要长时间保持线程运行,强烈建议您使用java.util.concurrent包提供的各种API,如Executor、ThreadPoolExecutor和FutureTask。
来自服务文档的 -
服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行运行时间更长的操作,或者提供功能供其他应用程序使用。
现在说到OP问到的问题--
When to use AsyncTask?Android实现了单线程模型,无论何时启动android应用程序,都会创建一个线程。假设我们在应用程序中的一个按钮上进行网络操作。单击按钮时,将向服务器发出请求,并等待响应。由于android的单线程模型,在等待时间响应之前,我们的屏幕是无响应的。所以我们应该避免在UI线程上执行长时间运行的操作。这包括文件和网络访问。
为了克服这个问题,我们可以创建新的线程并实现run方法来执行这个网络调用,这样UI就可以保持响应性。
但由于Android遵循单线程模型,Android UI工具包不是线程安全的,所以如果需要根据操作的结果对UI进行一些修改,那么这种方法可能会带来一些问题。
所以Android框架给出了一个很好的模式,它被封装到AsyncTask中。
When to use Service?我们可以使用它有两个主要原因-
更新:
理想情况下,AsyncTask应用于需要几秒钟的操作。有些任务会让线程长时间运行,因此建议使用java.util.concurrent包,如Executor、ThreadPoolExecutor和FutureTask。
服务更多地用于在某个时间间隔内应该发生的事情,或者在没有显示UI的情况下继续运行/检查某些事情。
发布于 2014-04-15 22:36:40
据我所知,AsyncTasks与它们启动的上下文相关联:例如,如果您从一个活动启动一个AsyncTask,然后想要完成此活动,它只会在AsyncTask完成时结束。另一方面,一旦服务启动,它就会完成自己的工作,而不依赖于任何上下文。
例如,当你想要在闪屏期间启动一个网络作业,而不考虑请求的结尾时,我认为这很有用:你将启动你的服务,让它在他那一边做它的工作,在另一边,启动你的活动,而不关心结果……
对于将要重复多次的任务,以及您希望在应用程序上下文期间继续执行的任务,服务也很有用:例如,媒体播放器。
https://stackoverflow.com/questions/23086686
复制相似问题