Android 文件下载速度慢

sim*_*mao 3 file-io android httpclient

我正在我的 Android 应用程序上下载。我使用的是本地网络连接,下载速度非常慢。

这是我正在使用的代码:

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();
Run Code Online (Sandbox Code Playgroud)

你发现任何问题吗?谢谢。

编辑:

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

#下载次数测试#

无缓冲输出
下载文件:1毫秒,开始下载
下载文件:179812毫秒,完成下载54687744字节
下载文件:结束,179813 毫秒

带缓冲输出
下载文件:1毫秒,开始下载
下载文件:178312毫秒,完成下载54687744字节
下载文件:结束,178313 毫秒

使用http客户端
下载文件:开始
下载文件:1毫秒,开始下载
下载文件:178241毫秒,完成下载54687744字节
下载文件:结束,178242 毫秒

因此,使用缓冲流或直接使用 HttpClient 不会改变任何东西......

我还应该提到我的代码位于 AsyncTask 内,因此publishProgress() 实际上已经在单独的线程上运行......

感谢您的帮助。

Nic*_*ion 5

您应该使用 BufferedInputStream 包装输入流。您可能会更浅地读取几个字节,而缓冲流将减轻其中的一些情况。我会首先尝试,缓冲输入和输出流以减少操作系统级别的写入延迟。

其次,我会小心你发布进度的方式。看起来您限制了它出现的次数,但您可能希望将下载移至其自己的可运行状态并使用执行程序服务进行下载,并且可能启动一个附加线程来评估所有下载的进度并触发进度必要时发送消息。