请教:使用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);就不能正常下载内容。如果没有执行上面的代码,就能够正常的下载。 怎么结束一个service里启动的activity? 关于android中按键事件向activity传递的问题 关于 audio的echo reference的问题 用http方式,根据经纬度查地址出错 初学android,写了个下载文件的小程序,不成功,帮忙看看 刚入门android,请问android开源到哪一个程度? 索尼SmartWatch 2应用开发马拉松大赛参赛答疑 关于android获取root权限? 子线程如何异步更新Fragment的UI界面 android官网上不去了 请教下关于彩信的问题 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);
}