首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android/Java慢网络IO

Android/Java慢网络IO
EN

Stack Overflow用户
提问于 2012-03-19 10:07:01
回答 2查看 1.4K关注 0票数 2

我有一个应用程序,我试图下载一个文件。我正在使用HTTPUrlConnection下载。一开始,下载速度是缓慢的。

我使用缓冲输入流并将缓冲区大小从1024增加到8192,从而提高了性能。在此之后增加缓冲区并没有带来任何改善。

下面是一个片段:

代码语言:javascript
复制
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);
}

即使在此之后,与安卓相比,同一文件在iPad上的下载速度也要快2倍。

我是不是遗漏了什么?

编辑

  1. 甚至在询问/提到之前,下载都是在一个单独的线程上运行的。我意识到我不需要缓冲输出,但我稍后会讨论这个问题:)
  2. 关于bytesToRead:我在试验不同的缓冲区大小,最后一次实验是256 to
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-23 20:43:31

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

票数 2
EN

Stack Overflow用户

发布于 2012-03-19 15:13:23

代码语言:javascript
复制
requestStatus((int) (downloaded * 100 / fileSize));

这可能是一个可能的瓶颈。在执行工作的同一线程中更新状态通常不是一个好主意。您的线程应该更新一个易失性变量..。

代码语言:javascript
复制
variable = (int) (downloaded * 100 / fileSize);

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

而且,大多数廉价的SD卡都很慢,给它们写信可能会导致大文件的速度减慢。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9768254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档