【发布时间】:2015-04-08 17:03:24
【问题描述】:
我想知道下载文件、异步任务还是服务哪个更好?
我的应用程序有八个按钮,其中一个按钮启动一个不同的下载(其中下载有 ~10MB)。当用户点击一个或多个按钮下载数据时使用异步任务或服务更好?
谢谢!
【问题讨论】:
标签: android android-asynctask android-service android-download-manager
我想知道下载文件、异步任务还是服务哪个更好?
我的应用程序有八个按钮,其中一个按钮启动一个不同的下载(其中下载有 ~10MB)。当用户点击一个或多个按钮下载数据时使用异步任务或服务更好?
谢谢!
【问题讨论】:
标签: android android-asynctask android-service android-download-manager
在任何情况下,您都应该使用AsyncTask,因为即使是服务也运行在不应该进行联网的主(GUI)线程中。是在服务还是活动中运行 AsyncTask 取决于您是否希望在后台继续下载。
【讨论】:
Service 在 UI 线程中运行,但 IntentService 使用它自己的线程。 IntentService 允许您在用户关闭应用程序的情况下继续下载,AsyncTask 非常适合用于短操作according to offical documentation。下载操作可能会很长,对我来说使用IntentService是一个更好的解决方案。
以上所有答案都有好处。但是生命周期问题是您应该考虑的最重要的事情。例如,假设您使用asyncTask。所以用户开始下载,突然他/她旋转屏幕,因为你将asyncTask生命周期绑定到activity另一个asyncTask操作将被启动并导致强制下载10mb。因此考虑到这一点,您应该同时使用service 和asyncTask 来维护生命周期问题和UI 线程网络问题。
update:Intent-service 是更好的解决方案,因为它在自己的线程中接收请求,并在无事可做时下线
【讨论】:
AsyncTask -- AsyncTask 操作线程和/或处理程序,如果您可以使用 Looper 做得更好的话,为什么还要麻烦? AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,理想情况下它应该用于短操作(最多几秒钟)。..在生产模式下如何判断是否不是会花很长时间?可能是网络不好、网络速度慢、网络阻塞、手机重启——所有这些都可能使您的下载损坏或未完成..我是应用程序的用户,当我什么都不用浪费捆绑包时我会生气..
如果你问我,请使用
服务
--Service不管什么应用程序/屏幕是可见的都运行,如果只有它可用,如果不继续下载并保存它,则与 UI 通信,AsyncTask 不构成通用线程框架。总是使用线程,它很酷,我们都喜欢它。
【讨论】: