【问题标题】:Incomplete response after httpget on 3g Android3g Android上httpget后响应不完整
【发布时间】:2011-03-31 19:45:40
【问题描述】:

在我的 Android 应用程序中,我正在尝试使用 httpclient 和 httpget 获取网站。 它在模拟器和我的 HTC Desire HD 上运行良好。 但是当我断开 wifi 并尝试在 3G 网络上获取网页时,响应有时不完整。 我正在使用以下代码来获取网页:

public String htmlBody (String strURI)
{
String strBody = "";
HttpClient httpclient = new DefaultHttpClient();
//HttpProtocolParams.setUseExpectContinue(httpclient.getParams(), false);
try {
        HttpGet httpget = new HttpGet(strURI);
        HttpResponse response = httpclient.execute(httpget, localContext);

        HttpEntity entity = response.getEntity();

        strBody = Functions.convertStreamToString(entity.getContent());
    }
} finally {
    httpclient.getConnectionManager().shutdown();
}

return strBody;
}

有没有办法确保响应是完整的?还是在响应不完整时恢复httpget?

【问题讨论】:

    标签: android httpclient http-get 3g


    【解决方案1】:

    我最近遇到了同样的问题。经过几次实验,我想我找到了答案: Android 不会通过 3G 网络中的单个 InputStream#read() 调用读取完整的响应。 以下代码可能有效:

    InputStream in = entity.getContent();
    int length = 0;
    while (true) {
        int ret = in.read(buffer, length, buffer.length - length);
        if (ret == -1) break;
        length += ret;
    }
    

    【讨论】:

    • 这里,什么是缓冲区?
    【解决方案2】:

    只是一个想法:让您的网站像一个特殊字符一样放在响应的末尾,然后检查该字符是否存在。如果它在那里你会知道你得到了完整的响应,如果它没有然后重新发送请求或其他东西!

    【讨论】:

    • 我已尝试重新执行 httpget,直到获得完整的网站。它会在几次尝试后得到完整的响应,但有时需要 10 到 30 次尝试。所以它实际上并不可行。
    • @user686404 为什么没有得到完整的响应?这很奇怪!如果没有抛出异常(即套接字超时),那么它应该得到我认为的整个响应!
    • 没有抛出异常,只是为了确保我明天会重新检查异常。
    • 响应不完整时不会抛出异常。
    • @user686404 好的!它不应该有所作为,但我是这样做的!尝试而不是:HttpEntity entity = response.getEntity(); strBody = Functions.convertStreamToString(entity.getContent()); 尝试拥有:strBody = EntityUtils.toString(response.getEntity()); 还告诉我们不完整的响应是什么样的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2016-05-24
    • 2021-04-15
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多