我在我的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();
你发现有什么问题吗?谢谢。
修改
我使用你的建议测试了我的代码,我得到了这些结果:
# Download times tests # Without bufferedoutput Downloading file: 1 ms, Start download Downloading file: 179812 ms, Finished downloading 54687744 bytes Downloading file: end, 179813 ms With bufferedoutput Downloading file: 1 ms, Start download Downloading file: 178312 ms, Finished downloading 54687744 bytes Downloading file: end, 178313 ms With httpclient Downloading file: begin Downloading file: 1 ms, Start download Downloading file: 178241 ms, Finished downloading 54687744 bytes Downloading file: end, 178242 ms
因此,使用Buffered流或直接使用HttpClient,不会改变任何内容......
我也应该提到我的代码在AsyncTask中,所以publishProgress()实际上已经在一个单独的线程上运行......
感谢您的帮助。
答案 0 :(得分:4)
您应该使用BufferedInputStream包装输入流。您可能会获得更多的几个字节的浅读取,缓冲流将减轻其中一些。我会首先尝试缓冲输入和输出流,以减少操作系统级写入延迟。
其次,我要小心你如何发布进度。您似乎限制了它出现的次数,但您可能希望将下载移动到自己的runnable中并使用执行程序服务进行下载,并可能启动另一个线程来评估所有下载的进度并触发进度必要的消息。
答案 1 :(得分:2)
使用HttpClient
代替URLConnection