2012-01-18 40 views
2

我希望得到一些关于如何加速我的应用程序中多个小文件的下载的建议。该应用程序下载300-400个小(15KB)文件。即使总大小很小,下载也需要很长时间,因为每个单独文件需要额外的握手时间。Android:加速多个小文件下载

我试图压缩文件,将其下载并解压缩到设备上,但最终它比直接全部下载它们要慢(尽管这可能是由于解压缩算法效率低下造成的)。

任何人都可以提供一些关于如何加速下载的建议(可能要求一次下载3个,而不是按顺序?)或有一个高效的解压缩代码片段,他们不介意分享它将不胜感激!

回答

3

即使总大小很小,由于每个单独文件的额外握手时间,下载也需要很长时间。

我不太确定你是如何做出这一决定的。如果是通过Traceview,很好。如果没有,请考虑使用Traceview来确定放慢速度的确切位置。

另外,我不太清楚“握手时间”是什么意思。如果您的意思是创建并拆除套接字连接,则HttpUrlConnectionHttpClient应支持保持活动状态。前者has a bug in Android 2.1 and earlier;后者要求你重用你的HttpClient实例。

正如古普塔先生所说,并行运行一些请求是一个合理的举措。您可以使用AsyncTask,或许使用您自己的线程池,以便管理并行特性。

但是,再次使用Traceview来确定您真正的问题所在。

+0

我目前只是使用UrlConnection。看起来如果我切换到HttpUrlConnection,保持活动时间将非常有帮助。我今晚晚些时候会测试一下。欣赏它! – Nedlinin 2012-01-18 19:06:22

2

浏览器处理这种情况的方式是启动多个线程并行下载资源。线程如何?好问题。我不确定,也许你可以使用某种基于处理器速度,内核数量和互联网连接类型的启发式 - 2G,3G,4G等。你可以有一个线程池,包含这些线程工作线程文件保证你永远不会超过给定数量的线程。

按顺序下载文件绝对不是正确的方式。 AsyncTask是这类工作的理想人选。如果你不知道如何使用,你可以看到this

+0

我实际上已经在使用AsyncTask在后台执行下载。不过,我正在调用一个单独的AsyncTask来顺序下载文件。 所以你的建议是创建多个AsyncTasks一次下载多个文件? – Nedlinin 2012-01-18 19:01:21

+0

是的。一次有多少人需要注意。 – 2012-01-19 02:57:08

0

我认为你最好的办法是使用缓存机制(假设这些文件将被多次下载)。如果你必须单独下载这些文件,那么是的,每个文件都会有一个单独的请求,它会只要需要取决于你的服务器/连接等。

如果用户将不得不多次下载这些文件,那么缓存这些文件将是最好的。 http://developer.android.com/guide/topics/data/data-storage.html

-1

你自己生成300-400个文件吗?然后你可以制作大约0.7到1 MB的6个文件。将它们下载到您的设备。然后将它们分成一个特殊的字符串。在将文件添加到较大的文件时也必须使用此字符串。

File1.txt: 这是文件1的内容!

FILE2.TXT: 我在这里;-)

分隔符: {%〜

生成的文件应该是这样的: FILE1.TXT:这是文件的内容1 { %〜File2.txt:我在这里;-)

在设备上查找“{%〜”,并在那里分割。

或者您可以使用线程同时下载更多的文件。

+0

我应该指定我不是自己创建这些文件。只需将它们从服务器上拉出即可 – Nedlinin 2012-01-18 19:03:50

0

在对Android开发者博客这个有趣的帖子看看:http://android-developers.blogspot.com/2011/09/androids-http-clients.html

在姜饼,我们增加了透明的响应压缩。 HttpURLConnection将这个头自动添加到传出 请求,并办理相应的响应:

Accept-Encoding: gzip

通过配置你的Web服务器来压缩 响应为能够支持客户充分利用这一点。

[...]

对于姜饼更好,HttpURLConnection是最好的选择。它的 简单的API和小尺寸使其非常适合Android。透明的 压缩和响应缓存减少网络使用,提高速度并节省电池。新的应用程序应该使用HttpURLConnection; [...]