【问题标题】:Android : Speeding up multiple small file downloadsAndroid : 加速多个小文件的下载
【发布时间】:2012-01-19 00:09:36
【问题描述】:

我希望就如何加快在我的应用中下载多个小文件的速度提供一些建议。该应用程序下载 300-400 个小 (15KB) 文件。即使总大小很小,下载也需要很长时间,因为每个单独的文件都有额外的握手时间..

我曾尝试将文件压缩、下载并在设备上解压缩,但最终它比直接下载它们要慢(尽管这可能是由于解压缩算法效率低下造成的......)

任何人都可以就如何加快下载速度提供一些建议(也许要求一次下载 3 个而不是按顺序下载?)或者有一个他们不介意分享的有效解压缩 sn-p 代码将不胜感激!

【问题讨论】:

    标签: android download zip


    【解决方案1】:

    尽管总大小很小,但下载需要很长时间,因为每个单独的文件都有额外的握手时间。

    我不太确定你是如何做出这个决定的。如果是通过 Traceview,那就太好了。如果没有,请考虑使用 Traceview 来确定减速的确切位置。

    另外,我不太确定您所说的“握手时间”是什么意思。如果您的意思是创建和拆除套接字连接,HttpUrlConnection 和 HttpClient 都应该支持 keep-alive。前者has a bug in Android 2.1 and earlier;后者要求您重用您的 HttpClient 实例。

    正如 Gupta 先生所建议的那样,并行运行几个请求是一个合理的举措。您可以使用AsyncTask,或许还可以使用您自己的线程池,这样您就可以管理并行特性。

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

    【讨论】:

    • 我目前只是使用 UrlConnection。看起来如果我切换到 HttpUrlConnection,保持活动时间将非常有帮助。今晚晚些时候我会测试这个。欣赏!
    【解决方案2】:

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

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

    【讨论】:

    • 我实际上已经在使用 AsyncTask 在后台进行下载。但是,我正在调用一个按顺序下载文件的 AsyncTask。所以你的建议是创建多个 AsyncTask 来一次下载多个文件?
    【解决方案3】:

    我认为您最好的选择是使用缓存机制(假设这些文件将被下载多次。)如果您必须单独下载这些文件,那么是的,将始终为每个文件发出单独的请求,并且需要只要它需要取决于您的服务器/连接等。

    如果用户需要多次下载这些文件,最好缓存这些文件。 http://developer.android.com/guide/topics/data/data-storage.html

    【讨论】:

      【解决方案4】:

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

      在 Gingerbread 中,我们添加了透明响应压缩。 HttpURLConnection 将自动将此标头添加到传出 请求,并处理相应的响应:

      Accept-Encoding: gzip

      通过将您的 Web 服务器配置为压缩来利用这一点 可以支持它的客户的响应。

      [...]

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

      【讨论】:

        【解决方案5】:

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

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

        文件2.txt: 我在这里;-)

        分隔符: {%~

        生成的文件应如下所示: File1.txt:这是文件1的内容!{%~File2.txt:我在这里;-)

        在您寻找“{%~”的设备上,拆分就在那里。

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

        【讨论】:

        • 我应该指定我不是自己创建这些文件。只需将它们从服务器中拉出即可。
        猜你喜欢
        • 2012-12-10
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        相关资源
        最近更新 更多