在ICS上使用POST“超时”的HttpURLConnection,在HC中工作

时间:2012-02-08 14:58:40

标签: android httpurlconnection android-4.0-ice-cream-sandwich

由于登录问题,我的Android平板电脑应用程序无法与ICS配合使用。当我查看我的代码并在ICS平板电脑上以调试模式运行时,我看到了问题,但我不明白。代码在我测试过的所有Honeycomb模型上都能正常运行,事实上我有两个平板电脑连接到我的电脑(一个三星Galaxy Tab运行3.2,一个摩托罗拉Xoom wifi运行4.0.3)并且代码在ICS上失败并且工作正常在HC。

失败是Socket Timeout异常。超时是2000毫秒,但我把它提升到100000毫秒进行测试,它没有任何影响。

使用ICS平板电脑上的浏览器,我可以转到该URL并进行响应,因此它似乎与网络无关。

我正在使用AsyncTask在后台线程上运行。

Slurp只接受InputStream的所有输入,并使用StringBuilder创建一个字符串表示。它在这个请求中实际上没用,但是我添加了它以查看服务器正在回复的内容。

我以与用户使用表单进行身份验证相同的方式发布到页面,这就是我使用x-www-form-urlencoded的原因。

此外,此代码在Honeycomb上完美运行,但在ICS上失败。

代码建立连接但是当它从服务器请求响应时失败,几乎就像服务器仍在等待某些东西......无论如何,这里是代码:

static public String authenticate(String service_url, String username, String password) throws IOException {
    if (username == null || password == null)
        throw new IOException();

    String charset = "UTF-8";
    String query = String.format("Email=%s&Password=%s",URLEncoder.encode(username, charset),URLEncoder.encode(password, charset));
    byte [] data = query.getBytes(charset);

    URL url = new URL(service_url);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Accept-Charset", charset);
    connection.setRequestProperty("Content-Length", Integer.toString(data.length));

    connection.setDoOutput(true);

    connection.setRequestMethod("POST");
    connection.setReadTimeout(5000); // 2 second timeout.


    try {
        connection.connect();

        DataOutputStream pw = new DataOutputStream (connection.getOutputStream());
        pw.writeBytes(query);
        pw.flush();
        pw.close();

        int code = connection.getResponseCode(); //SOCKET TIMEOUT HERE
        if (code == 200 || code == 302)
        {
            InputStream is = connection.getInputStream();
            String value = slurp(is);

            List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
            if (cookies == null)
                throw new IOException();

            for (String cookie : cookies) {
                if (cookie.startsWith("cpms")) {
                    cookieTime = new DateTime();  //crazy but the expires time in the cookie is not actually accurate.
                    return cookie; // this is the only correct path out.
                }
            }
        }
        else
            Logger.e(StaticUtils.class, "Invalid response code while logging in: " + code);
    }
    catch (IOException ioe)
    {
        Logger.e(StaticUtils.class, ioe);
        throw ioe; // log it and then throw it back.        
    } finally {
           connection.disconnect();
    }
    return null;
}

0 个答案:

没有答案