请教:使用HttpClient实现分段下载 大家好,我在使用HttpClient对象,如果正常下载,即不添加Range头域,则下载一切正常,但是当要实现HTTP分段下载的时候,即为HttpGet对象添加上Range字段的时候,执行到execute()的时候,就会堵塞,而且一直没有回应。请问如何解决该问题?谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是kepp-alive的吗,time out设置了吗?response是什么,可以把报头贴出来吗? http_request_loop: while (!mQuit) { mHttpGet = new HttpGet(mUrl); if (mContentLength > 0) { if (mRequestEnd > mContentLength) { mRequestEnd = mContentLength; } } // 根据情况添加分段 if (mRequestBegin >= 0 && mRequestEnd >= 0) { if (mRequestEnd == 0 && mRequestBegin == 0) { // 内置的分段下载 end = begin + DEFAULT_HTTP_RANGE_SIZE; if (mContentLength > 0 && end > mContentLength) { end = mContentLength; } mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end); } else if (mRequestEnd - mRequestBegin >= DEFAULT_HTTP_RANGE_SIZE){ // 只有在请求的数据比较大的时候才分段 end = begin + DEFAULT_HTTP_RANGE_SIZE; if (end >= mRequestEnd) { end = mRequestEnd; } mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end); } } HttpResponse response; try { response = mHttpClient.execute(mHttpGet); } catch (IllegalArgumentException e) { e.printStackTrace(); mHttpGet.abort(); onErrorMsg(ERROR_EXCEPTION); return; } catch (IOException e) { e.printStackTrace(); mHttpGet.abort(); onErrorMsg(ERROR_EXCEPTION); return; } catch (Exception e) { e.printStackTrace(); mHttpGet.abort(); onErrorMsg(ERROR_EXCEPTION); return; } int statusCode = response.getStatusLine().getStatusCode(); switch (statusCode) { case 200: if (handleRead(response) < 0) { return; } break; case 206: if (handleRead(response) < 0) { return; } break; case 302: // 重定向 Header header = response.getFirstHeader("Location"); if (null != header) { try { redirectUrl = new URI(mUrl).resolve(new URI(header.getValue())).toString(); mUrl = redirectUrl; } catch (URISyntaxException e) { // 解析http-location字段出错,重新请求 e.printStackTrace(); mHttpGet.abort(); break http_request_loop; } } else { // 出错 mHttpGet.abort(); onErrorMsg(ERROR_UNKOWN); return; } mHttpGet.abort(); break http_request_loop; // 重定向,直接重新请求 default: mHttpGet.abort(); onErrorMsg(ERROR_INVALID_HTTP_CODE); return; } if (end > 0) { // 分段下载 int httpEnd = mRequestEnd == 0 ? mContentLength : mRequestEnd; begin = end + 1; if (begin >= httpEnd) { mEof = true; break; } } else {// 不使用分段下载,已经结束 mEof = true; break; } } if (mQuit) { sendMessage(MSG_STOPPED); } else { sendMessage(MSG_REQUEST_COMPLETE); } 如果执行了这句代码:mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end);就不能正常下载内容。如果没有执行上面的代码,就能够正常的下载。 急急急~~android调用系统图库,如何一次性选择多张图片? 求助,从网络下载多图片到本地,怎么用handlerthread实现 如何开发后台应用程序 ListView和Button在一起的时候的一个问题 listview item拖动到listview以外的区域。 Android开源,开在哪呢? 最新的SDK,为什么进行调试时,会重新打开模拟器? adb.exe 停止工作了,怎么回事啊? 为什么android下网络编程总是有错? android随便run点开之后不能运行app 请教下关于彩信的问题 slidingDrawer克隆后改变layoutParams导致所有都变
http_request_loop:
while (!mQuit) {
mHttpGet = new HttpGet(mUrl);
if (mContentLength > 0) {
if (mRequestEnd > mContentLength) {
mRequestEnd = mContentLength;
}
}
// 根据情况添加分段
if (mRequestBegin >= 0 && mRequestEnd >= 0) {
if (mRequestEnd == 0 && mRequestBegin == 0) { // 内置的分段下载
end = begin + DEFAULT_HTTP_RANGE_SIZE;
if (mContentLength > 0 && end > mContentLength) {
end = mContentLength;
}
mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end);
} else if (mRequestEnd - mRequestBegin >= DEFAULT_HTTP_RANGE_SIZE){ // 只有在请求的数据比较大的时候才分段
end = begin + DEFAULT_HTTP_RANGE_SIZE;
if (end >= mRequestEnd) {
end = mRequestEnd;
}
mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end);
}
}
HttpResponse response;
try {
response = mHttpClient.execute(mHttpGet);
} catch (IllegalArgumentException e) {
e.printStackTrace();
mHttpGet.abort();
onErrorMsg(ERROR_EXCEPTION);
return;
} catch (IOException e) {
e.printStackTrace();
mHttpGet.abort();
onErrorMsg(ERROR_EXCEPTION);
return;
} catch (Exception e) {
e.printStackTrace();
mHttpGet.abort();
onErrorMsg(ERROR_EXCEPTION);
return;
}
int statusCode = response.getStatusLine().getStatusCode();
switch (statusCode) {
case 200:
if (handleRead(response) < 0) {
return;
}
break;
case 206:
if (handleRead(response) < 0) {
return;
}
break;
case 302:
// 重定向
Header header = response.getFirstHeader("Location");
if (null != header) {
try {
redirectUrl = new URI(mUrl).resolve(new URI(header.getValue())).toString();
mUrl = redirectUrl;
} catch (URISyntaxException e) { // 解析http-location字段出错,重新请求
e.printStackTrace();
mHttpGet.abort();
break http_request_loop;
}
} else { // 出错
mHttpGet.abort();
onErrorMsg(ERROR_UNKOWN);
return;
}
mHttpGet.abort();
break http_request_loop; // 重定向,直接重新请求
default:
mHttpGet.abort();
onErrorMsg(ERROR_INVALID_HTTP_CODE);
return;
}
if (end > 0) { // 分段下载
int httpEnd = mRequestEnd == 0 ? mContentLength : mRequestEnd;
begin = end + 1;
if (begin >= httpEnd) {
mEof = true;
break;
}
} else {// 不使用分段下载,已经结束
mEof = true;
break;
}
}
if (mQuit) {
sendMessage(MSG_STOPPED);
} else {
sendMessage(MSG_REQUEST_COMPLETE);
}