我希望就如何加速在我的应用中下载多个小文件提供一些建议。该应用程序下载300-400个小(15KB)文件。即使总大小很小,下载也需要很长时间,因为每个文件都需要额外的握手时间..
我试图将文件压缩,下载并在设备上解压缩,但最终它比直接下载所有文件要慢(尽管这可能是因为解压算法效率低下)。
任何人都可以提供一些关于如何加快下载速度的建议(可能要求一次下载3个而不是按顺序下载?)或者有一个高效的解压缩代码片段他们不介意分享它将不胜感激!< / p>
答案 0 :(得分:3)
即使总大小很小,下载也需要很长时间,因为每个文件都需要额外的握手时间。
我不确定你是如何做出这个决定的。如果是通过Traceview,那很好。如果没有,请考虑使用Traceview确定减速的确切位置。
另外,我不太确定你的“握手时间”是什么意思。如果您的意思是创建和拆除套接字连接,HttpUrlConnection
和HttpClient
都应该支持keep-alive。前has a bug in Android 2.1 and earlier;后者要求您重复使用HttpClient
实例。
正如古普塔先生所说,并行运行一些请求是一个合理的举措。您可以使用AsyncTask
,也许使用自己的线程池,以便管理并行特征。
然而,再次使用Traceview确定您的真正问题所在。
答案 1 :(得分:2)
浏览器处理此问题的方法是启动多个线程以并行下载资源。线程怎么样?好问题。我不确定,也许你可以使用某种基于处理器速度,内核数量和互联网连接类型的启发式方法 - 2G,3G,4G等。你可以拥有这个线程的线程池工作线程下载这些文件保证您永远不会超过给定数量的线程。
顺序下载文件绝对不是正确的方法。 AsyncTask
是此类工作的理想人选。如果您不知道如何使用,可以看到this。
答案 2 :(得分:0)
我认为您最好的选择是使用缓存机制(假设这些文件将被多次下载。)如果您必须单独下载这些文件,那么是的,将始终为每个文件单独请求并且它将需要只要它需要依赖于您的服务器/连接等
如果用户不得不多次下载这些文件,那么缓存这些文件将是最佳选择。 http://developer.android.com/guide/topics/data/data-storage.html
答案 3 :(得分:0)
在Android开发者博客上查看这篇有趣的帖子:http://android-developers.blogspot.com/2011/09/androids-http-clients.html
在Gingerbread中,我们添加了透明的响应压缩。
HttpURLConnection
会自动将此标头添加到外发 请求,并处理相应的响应:
Accept-Encoding: gzip
通过将Web服务器配置为压缩来利用此功能 对可以支持它的客户的回复。
[...]
对于Gingerbread而言,
HttpURLConnection
是最好的选择。它的 简单的API和小巧的尺寸使其非常适合Android。透明 压缩和响应缓存减少网络使用,提高速度和 节省电池。新应用程序应使用HttpURLConnection
; [...]
答案 4 :(得分:-1)
您自己生成300-400个文件吗?然后你可以制作6个文件,每个大约0.7到1 MB。将它们下载到您的设备。然后将它们拆分为特殊的String。将文件添加到大文件时也必须使用此字符串。
FILE1.TXT: 这是文件1的内容!
FILE2.TXT: 我在这里; - )
分隔符: {%〜
生成的文件应如下所示: File1.txt:这是文件1的内容!{%~File2.txt:我在这里; - )
在设备上,你会找到“{%〜”并且分裂就在那里。
或者您可以使用Threads同时下载更多文件。