【问题标题】:Very slow download speeds with this code, any help improving it?这段代码的下载速度非常慢,有什么帮助改进它吗?
【发布时间】:2012-03-04 15:51:10
【问题描述】:

在我的 Android 应用程序中,我需要下载一个约 40 MB 的文件,我正在手机中测试代码,但下载速度真的很慢,我尝试从使用我的 PC 时快速的不同来源下载。

这是我在下载服务中使用的代码:

URLConnection conexion;
    URL url;
    int lenghtOfFile = 0;


    try {
        url = new URL("<URL>");
        conexion = url.openConnection();
        conexion.connect();
        lenghtOfFile = conexion.getContentLength();


        try {

            File f = new File(Environment.getExternalStorageDirectory() + "/testing");


            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(f.getAbsolutePath());

            byte data[] = new byte[1024];

            long total = 0;

            while ((count = input.read(data)) != -1) {
                total += count;

                notification.contentView.setProgressBar(R.id.status_progress, 100, (int) (total * 100 / lenghtOfFile), false);
                notification.contentView.setTextViewText(R.id.status_text, Long.toString(total * 100 / lenghtOfFile));

                notificationManager.notify(42, notification);
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        } catch (Exception e) {
            e.getCause();
            e.getMessage();
        }


    } catch (Exception e) {
    }


}

这个代码有可能是 dl 速度慢的原因吗?关于如何使下载速度更快的任何想法?

【问题讨论】:

  • 尝试增加缓冲区大小,它会减少I/O操作的数量,可以让你的应用程序运行得更快。
  • 减少更新 ui 的频率,例如每十次迭代,也可能会提高性能。
  • 您也可以线程 UI 更新,优先级较低。
  • 已经列出了一些好的答案,所以我会横向思考一下,问有没有什么办法可以减小文件的大小?可以压缩吗?你可以只发送你需要的文件片段吗?等等等等。
  • @PaulGrime 这是我能得到的最小尺寸。它们已经被压缩了。感谢您的评论。

标签: java android download


【解决方案1】:

改一下

byte data[] = new byte[1024];

byte data[] = new byte[4096];

正如 commonsware 所说, 以更少的频率更新您的下载进度通知。

例如: 在循环中使用一个简单的计数器变量,并在达到 10 时更新进度,然后将其重置..!

【讨论】:

  • 也许这应该是一条评论?
  • 很遗憾,我无法对问题发表评论..:(
  • 这对我来说似乎是一个合法的答案。 (不过我认为这不会有帮助。)
  • 啊,是的。愚蠢的 SO 代表规则:/ @StephenC 好吧,这基本上就是 Egor 所说的。让我犹豫的是,这不是一个明确的“这就是答案”的解决方案,而是一个“试试看”的解决方案。当然,Dipz 不能发表评论,所以这是可行的。
  • @RyanAmos - 这并不是一个合法的答案。
【解决方案2】:

也许使用DownloadManager 会更好地为您服务。
Android 将为您下载文件。 如果 DownloadProvider 不适合您,您至少可以对您的代码进行基准测试。

【讨论】:

  • DownloadManager 仅适用于 2.3+ 对吗?我也对旧设备感兴趣
【解决方案3】:

当您更新Notification 时,每下载 1KB 就会执行 IPC。对于 40MB 的文件,这意味着您正在执行大约 40,000 次 IPC 调用。请减少更新您的Notification 的频率。

【讨论】:

  • 谢谢你的提示,我没想到。
【解决方案4】:

我怀疑核心问题是您的(Android 手机的)ISP 提供的网络带宽/数据速率远低于您的 PC 通过其 LAN/宽带连接获得的网络带宽/数据速率。可能是您的手机从本地小区接收到微弱的信号,或者小区过载,或者主干网过载,或者您的 ISP 对等安排不佳。

如果这是问题所在,除了(也许)更换电话运营商或重新配置(家庭?)网络以便您的手机可以使用 WiFi 与本地 WiFi 路由器通信之外,您无能为力。

【讨论】:

  • 我所做的所有测试都是在 WiFi 中进行的,所以这不是问题所在。无论如何感谢您的回答。
猜你喜欢
  • 2011-05-02
  • 2018-01-22
  • 1970-01-01
  • 2018-01-02
  • 2015-11-21
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多