我有一个应用程序,我正在尝试下载文件。我正在使用HTTPUrlConnection
进行下载。最初下载速度很慢。
我通过使用缓冲输入流并将缓冲区大小从1024增加到8192来提高性能。将缓冲区增加到超出该范围不会导致任何改进。
这是一个片段:
InputStream inputStream = (InputStream) new URL(requestURL)
.getContent();
BufferedInputStream bufferedInputStream = new BufferedInputStream(
inputStream);
OutputStream outputStream = new FileOutputStream(fileSaveUrl);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
outputStream);
int bytesToRead = 1024 * 256;
byte buffer[] = new byte[bytesToRead];
while ((count = bufferedInputStream.read(buffer)) != -1
&& !isCancelled()) {
requestStatus((int) (downloaded * 100 / fileSize));
bufferedOutputStream.write(buffer, 0, count);
}
即使在此之后,与Android相比,iPad上的同一文件下载速度提高了2倍。
我错过了什么吗?
编辑
bytesToRead
:我正在尝试不同的缓冲区大小,最后的实验是256KB 答案 0 :(得分:2)
requestStatus((int) (downloaded * 100 / fileSize));
这可能是一个可能的瓶颈。在同一个线程中更新状态通常不是一个好主意。你的线程应该更新一个volatile变量......
variable = (int) (downloaded * 100 / fileSize);
然后你的UI线程应该轮询该变量以显示进度。
此外,大多数便宜的SD卡都很慢,写入它们可能会导致大文件速度变慢。
答案 1 :(得分:2)
问题是我在同一个线程上下载并写入SD卡。使用阻塞队列缓冲区将工作拆分为两个线程,以提高性能。