安卓文件下载速度慢

3

我正在使用安卓应用下载文件。我使用了本地网络连接,但是下载速度非常慢。

以下是我使用的代码:

URL url = new URL(ep.getFileURL());
File destFile = new File(<path to sd card file>);

URLConnection uCon = url.openConnection();
InputStream is = uCon.getInputStream();
OutputStream os = new FileOutputStream(destFile);

int progress = 0;
int lastProgress = 0;
int totalSize = uCon.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[4096];
int count = -1;
while((count = is.read(buffer)) != -1)
{
    os.write(buffer, 0, count);

downloadedSize = downloadedSize + count;
    progress = (int)(downloadedSize * 100.0 / totalSize);
    if(progress - lastProgress >= 5) {
        publishProgress(progress);
        lastProgress = progress;
    }
}

os.close();

你有看到任何问题吗?谢谢。

编辑:

我使用了你的建议测试了我的代码,得到了以下结果:

# 下载时间测试 #
未使用缓冲输出 下载文件:1毫秒,开始下载 下载文件:179812毫秒,完成下载54687744字节 下载文件:结束,179813毫秒
使用缓冲输出 下载文件:1毫秒,开始下载 下载文件:178312毫秒,完成下载54687744字节 下载文件:结束,178313毫秒
使用httpclient 下载文件:开始 下载文件:1毫秒,开始下载 下载文件:178241毫秒,完成下载54687744字节 下载文件:结束,178242毫秒

因此,使用缓冲流或直接使用HttpClient并没有改变什么...

我还应该提到,我的代码在AsyncTask中,所以publishProgress()实际上已经在一个单独的线程上运行了...

谢谢你的帮助。


1
你现在的速度是多少?你期望得到什么速度?如果你怀疑自己的IO速度,首先要做的是计时,这样你就可以判断你的改进是否有显著的差别。 - Jason LeBrun
在publishProgress()中你做什么?(一些代码会很有帮助..) - ap400200
2个回答

5

您应该使用BufferedInputStream包装输入流。您可能会得到更多浅层次的几个字节读取,缓冲流将减轻一些。我建议首先尝试这样做,对输入和输出流进行缓冲,以减少操作系统级别的写入延迟。

其次,我建议您小心处理进度发布的方式。看起来您正在限制其出现的次数,但是您可能需要将下载放到自己的runnable中,并使用执行器服务进行下载,并启动另一个线程来评估所有下载的进度并根据需要触发进度消息。


1
FileOutputStream 应该也要被包装在 BufferedOutputStream 中。我猜这是 Android 中 AsyncTask 的一部分,所以 publishProgress 会在 UI 线程上排队一个消息,而不会阻塞下载。因此,在这里 publishProgress 可能 不是问题。 - Jason LeBrun

3

使用HttpClient代替URLConnection


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接