Android / Java慢速网络IO

时间:2012-03-19 10:07:02

标签: java android performance httpurlconnection

我有一个应用程序,我正在尝试下载文件。我正在使用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倍。

我错过了什么吗?

编辑

  1. 甚至在您提出/提及之前,下载就是在一个单独的线程上运行。 我确实意识到我不需要缓冲输出,但我稍后会解决这个问题:)
  2. 关于bytesToRead:我正在尝试不同的缓冲区大小,最后的实验是256KB

2 个答案:

答案 0 :(得分:2)

requestStatus((int) (downloaded * 100 / fileSize));

这可能是一个可能的瓶颈。在同一个线程中更新状态通常不是一个好主意。你的线程应该更新一个volatile变量......

variable = (int) (downloaded * 100 / fileSize);

然后你的UI线程应该轮询该变量以显示进度。

此外,大多数便宜的SD卡都很慢,写入它们可能会导致大文件速度变慢。

答案 1 :(得分:2)

问题是我在同一个线程上下载并写入SD卡。使用阻塞队列缓冲区将工作拆分为两个线程,以提高性能。