我正在尝试使用HttpCLient 4下载一个zip文件,它的速度大约为.5(千字节/千比特)?每分钟。该文件小于MB大,下载可能需要一个小时!难道我做错了什么?我该怎么做呢?这是我目前的实施:
@Override
protected Uri doInBackground(String... params) {
publishProgress("Downloading...");
try {
HttpPost searchPOST = new HttpPost("http://www.somesite.com/" + searchResult.getURLSuffix());
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
//added parameters here...
UrlEncodedFormEntity paramsEntity = new UrlEncodedFormEntity(formparams, HTTP.UTF_8);
searchPOST.setEntity(paramsEntity);
HttpResponse manualResponse = client.execute(searchPOST);
Header fileNameHeader = manualResponse.getFirstHeader("Content-Disposition");
Pattern p = Pattern.compile("filename=\"(.+?)\"");
Matcher m = p.matcher(fileNameHeader.getValue());
if (m.find()) {
String fileName = m.group(1);
InputStream zipStream = manualResponse.getEntity().getContent();
File cacheDir = context.getCacheDir();
String tempFileForZip = cacheDir.getAbsolutePath() + "/" + fileName;
FileOutputStream fos = new FileOutputStream(tempFileForZip);
int bytesDownloaded = 0;
try {
int c;
while ((c = zipStream.read()) != -1) {
fos.write(c);
bytesDownloaded++;
kilobytesDownloaded=(bytesDownloaded / 1000);
publishProgress((String[])null);
}
} finally {
if (zipStream != null) {
zipStream.close();
}
if (fos != null) {
fos.close();
}
}
fos.close();
String zipFilePath = tempFileForZip;
//Change to indeterminate
kilobytesDownloaded = fileSize;
publishProgress("Extracting...");
//TODO: Preferences for save directory
saveDirectory = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "Downloads/");
ZipTools.unzipArchive(new File(zipFilePath), saveDirectory);
}
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
return Uri.fromFile(saveDirectory);
}
答案 0 :(得分:7)
步骤1:不要为每个字节调用publishProgress()
。
步骤2:一次读取多个字节。更好的是,不要直接使用InputStream
- 使用HttpEntity#writeTo()
让HttpClient
将数据写入输出文件。