我使用以下代码下载文件,我发现与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的顶级函数和本机代码之间看不到太多时间。
任何想法都会很棒,因为糟糕的表现使我们的应用程序几乎无法使用。
谢谢,
尼克
答案 0 :(得分:2)
android文档说明FileOutputStream没有缓冲,应该包装在BufferedOutputStream中。
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream("XXXX"));
// write to out
} finally {
if (out != null) {
out.close();
}
}
的更多信息
答案 1 :(得分:0)
我已经改写了这个答案,在与尼克亲自交谈之后(2011年9月),他说在真实的设备上没有问题。
问题似乎是仿真器和真实硬件之间的性能差异。他还检查了他没有使用限制器。
我从未尝试过使用模拟器下载大文件,所以我不能发表评论,只是说尼克现在很开心; - )
答案 2 :(得分:0)
连接有很多options。
你可以尝试自己设置一些
或
尝试使用AndroidHttpClient