Android慢速文件下载vs iOS& BlackBerry - DefaultHttpClient

时间:2011-06-02 15:22:34

标签: android download httpresponse

我使用以下代码下载文件,我发现与iOS和黑莓上几乎相同的代码相比,性能确实非常慢。

除了测试各种不同的SDK版本和OSX与Windows之外,我还在各种设备上试用过该应用程序 - HTC Desire,三星Galaxy,Huwei Pulse,HTC Wildfire - 所有这些都与iPhone和BlackBerry设备相比表现糟糕。

观看我为比较3个仿真器的速度而制作的视频:   Android vs. iOS and BlackBerry

以下是Android代码:

FileOutputStream fos = null;
InputStream input = null;

try {   
fos = new FileOutputStream("XXXX");

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("XXXX");
        HttpResponse response = httpclient.execute(httpget);
        input = response.getEntity().getContent();    

byte[] buffer = new byte[8192];
int readBytes;
while (((readBytes = input.read(buffer, 0, buffer.length)) != -1)
&& !thePackage.getPackageStatus().equals(
PackageStatus.STATUS_CANCEL_DOWNLOAD)) {
fos.write(buffer, 0, readBytes);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}

if (input != null) {
try {
input.close();
} catch (IOException e) {
}

    }
}

我已经尝试过BufferedHttpEntity和其他缓冲/线程策略,但是这个版本的代码是我们尝试的任何不同选项中表现最佳的。我已经运行了大量的代码分析,并且在Dalvik / Apache Harmony的顶级函数和本机代码之间看不到太多时间。

任何想法都会很棒,因为糟糕的表现使我们的应用程序几乎无法使用。

谢谢,

尼克

3 个答案:

答案 0 :(得分:2)

android文档说明FileOutputStream没有缓冲,应该包装在BufferedOutputStream中。

    OutputStream out = null;
    try {
        out = new BufferedOutputStream(new FileOutputStream("XXXX"));

        // write to out

    } finally {
        if (out != null) {
            out.close();
        }

    }

FileOutputStream

的更多信息

答案 1 :(得分:0)

我已经改写了这个答案,在与尼克亲自交谈之后(2011年9月),他说在真实的设备上没有问题。

问题似乎是仿真器和真实硬件之间的性能差异。他还检查了他没有使用限制器。

我从未尝试过使用模拟器下载大文件,所以我不能发表评论,只是说尼克现在很开心; - )

答案 2 :(得分:0)

连接有很多options。 你可以尝试自己设置一些 或
尝试使用AndroidHttpClient