Android 下载管理器与后台服务
我需要下载多个图像和视频,并且需要“一次性”下载,因此不需要任何缓存,这就是我不使用截击的原因。截击视频可能很昂贵 接下来,我偶然发现了内置的Android,它似乎有助于在队列中进行下载,API总体上看起来并不差,但我想知道它与使用Android 下载管理器与后台服务,android,android-download-manager,Android,Android Download Manager,我需要下载多个图像和视频,并且需要“一次性”下载,因此不需要任何缓存,这就是我不使用截击的原因。截击视频可能很昂贵 接下来,我偶然发现了内置的Android,它似乎有助于在队列中进行下载,API总体上看起来并不差,但我想知道它与使用服务和ScheduledThreadPoolExecutor(一个由Commonware的帖子指定的选项)相比会如何 注意:我的用例严格地说是而不是为网格下载图像的用例,有可能重复请求。我的请求只能是一次性下载。请求可能是少数图像和视频的混合 服务中的Schedule
服务
和ScheduledThreadPoolExecutor
(一个由Commonware的帖子指定的选项)相比会如何
注意:我的用例严格地说是而不是为网格下载图像的用例,有可能重复请求。我的请求只能是一次性下载。请求可能是少数图像和视频的混合
服务中的ScheduledThreadPoolExecutor
是否会显著更快
我想知道[DownloadManager
]与使用带有ScheduledThreadPoolExecutor的服务
相比会有什么不同
DownloadManager
不需要运行进程,它可以处理重试策略等所有问题。另一方面,下载管理器
:
- 要求从简单URL启动下载(即,无会话cookie)
- 通过下载应用程序向用户显示结果
- 只能轻松下载到外部存储
- 一次下载一个项目
- 可能会延迟下载开始一段时间(例如,如果正在下载其他内容)
ScheduledThreadPoolExecutor
不太可能是进程内解决方案的一部分,尽管ThreadPoolExecutor
可能是。只有当您需要一次下载N个视频,并且不想使用HTTP客户端API(例如OkHttp)提供的任何多线程选项时,才需要这样做。因为你想在后台下载这些东西(大概),而你不知道用户在前台做什么,我建议一次只下载一个视频,这样你就不会让用户在前台使用互联网变得困难
服务内部的ScheduledThreadPoolExecutor是否会显著更快
你在比较苹果和小行星
ScheduledThreadPoolExecutor
和Service
都不执行HTTP下载。进程内HTTP客户端API(HttpUrlConnection
、OkHttp、Volley等)执行HTTP下载,一些进程外选项(尤其是DownloadManager
)也执行HTTP下载。
适当的比较应该是DownloadManager
和以下组合:
- 进程内HTTP客户端API,以及
- 某种形式的服务,即使用户离开您的UI,也允许继续下载
从纯速度的角度来看,任何HTTP客户端API都将受到网络的限制,因此其性能应该大致相当。Volley不适合大规模下载,因为它会将整个结果放在内存中,并且您没有视频的堆空间。其他选项将允许您将结果流式传输到文件。您需要公共服务还是私人服务?DM是公共下载程序,所以它可能不适合您的需要,但它实现起来很快。ThreadPoolExecutor只是操纵线程,所以您将在线程内使用HttpClient下载。服务很好,但如果你需要有保证的交付,你应该看看JobScheduler(或SyncAdapter)。@ViktorYakunin:嗯,你有什么私人服务吗?我的意思是,在我的要求中,公共是可以的,但是如果知道是否有私人的东西,那就太好了。最近我发现了这个库,它可能适合你的需要()。当然,您自己的实现(服务、IntentService、JobScheduler)将以您自己的方式工作want@ViktorYakunin添加一个新的库也是一个不错的主意,但是这会增加APK的大小。谢谢你的回复。我没有提到的一点是,在我的用例中,用户很可能同时在前台与我的应用程序的活动进行交互。你的答案会因为这个而改变吗?@pulp_fiction:可能不会,只是因为“可能”!=“保证”。视频往往很大,下载可能需要很长时间。用户甚至可以在下载过程中关闭屏幕。因此,如果您使用的是进程内解决方案,您将需要某种形式的服务
(可能是常规服务
,但使用startForeground()
)。或者,使用DownloadManager
“通过下载应用程序向用户显示结果”-可以使用setVisibleInDownloadsUi(false)