Android 下载管理器与后台服务

Android 下载管理器与后台服务,android,android-download-manager,Android,Android Download Manager,我需要下载多个图像和视频,并且需要“一次性”下载,因此不需要任何缓存,这就是我不使用截击的原因。截击视频可能很昂贵 接下来,我偶然发现了内置的Android,它似乎有助于在队列中进行下载,API总体上看起来并不差,但我想知道它与使用服务和ScheduledThreadPoolExecutor(一个由Commonware的帖子指定的选项)相比会如何 注意:我的用例严格地说是而不是为网格下载图像的用例,有可能重复请求。我的请求只能是一次性下载。请求可能是少数图像和视频的混合 服务中的Schedule

我需要下载多个图像和视频,并且需要“一次性”下载,因此不需要任何缓存,这就是我不使用截击的原因。截击视频可能很昂贵

接下来,我偶然发现了内置的Android,它似乎有助于在队列中进行下载,API总体上看起来并不差,但我想知道它与使用
服务
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)