大家好,我在使用HttpClient对象,如果正常下载,即不添加Range头域,则下载一切正常,但是当要实现HTTP分段下载的时候,即为HttpGet对象添加上Range字段的时候,执行到execute()的时候,就会堵塞,而且一直没有回应。
请问如何解决该问题?谢谢!!!

解决方案 »

  1.   

    是kepp-alive的吗,time out设置了吗?response是什么,可以把报头贴出来吗?
      

  2.   


    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);
    }
      

  3.   

    如果执行了这句代码:mHttpGet.addHeader("Range", "bytes=" + begin + "-" + end);就不能正常下载内容。如果没有执行上面的代码,就能够正常的下载。