【问题标题】:Android, Is there something wrong with HttpPost method in Android 4.0?Android,Android 4.0 中的 HttpPost 方法有问题吗?
【发布时间】:2012-07-08 13:45:06
【问题描述】:

几年前,我开发了一个应用程序。在每个活动中,我都使用 HttpPost 方法将一些参数发送到服务器。在 Android v4.0 以下的所有设备上使用 3G 服务运行良好。我的代码是这样的:

private String postData() {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(PropertyManager.getLoginURL());

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
    nameValuePairs.add(new BasicNameValuePair("u", Uri.encode(PropertyManager.getUserId())));
    nameValuePairs.add(new BasicNameValuePair("p", Encryption.encrypt(PropertyManager.getPassword())));
    nameValuePairs.add(new BasicNameValuePair("v", PropertyManager.VER));
    nameValuePairs.add(new BasicNameValuePair("t", "0"));

    try {
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        Log.i("Requestd Connection", httppost.getURI().toString());


        HttpResponse response = httpClient.execute(httppost);
        String responseBody = EntityUtils.toString(response.getEntity());
        Log.i("Server Response: ", responseBody);

        if (response.containsHeader("Set-Cookie")) {
            String sessionId = extractSessionId(response.getHeaders("Set-Cookie")[0].getValue());
            PropertyManager.setSessionID(sessionId);
            Log.i("Session Id:", sessionId);
        }


    String str = responseBody.substring(0, 9);
    if(str.equalsIgnoreCase("<!DOCTYPE")) {
        Log.i("postData()", "HTML found instead of XML. Try to extract info...");

        str = responseBody.substring(responseBody.indexOf("<tr>")+4, responseBody.lastIndexOf("</tr>"));
        str = str.toUpperCase();
        Log.i("Extracted info", str);

        return str;
    } else              
        return responseBody;

    } catch(UnsupportedEncodingException usee) {
        usee.printStackTrace();
    } catch(ClientProtocolException cpe) {
        cpe.printStackTrace();
    } catch(IOException ioe) {
        ioe.printStackTrace();
    }

    return null;
}

logcat 中的预期结果(我可以在 v4.0 以下的 Android 操作系统上得到它):

07-09 12:38:49.593: I/JupiterMPro(4273):                onCreate executes ...
07-09 12:38:49.601: I/MSBootUp(4273):                   inside onCreate();
07-09 12:38:49.694: I/MA_isOnline(4273):                Checking Internet Connection...
07-09 12:38:49.698: I/MA_isOnline(4273):                Internet Connection found.
07-09 12:38:49.730: I/JupiterMPro(4273):                onDestroy executes ...
07-09 12:39:40.675: I/MA_isOnline(4273):                Checking Internet Connection...
07-09 12:39:40.679: I/MA_isOnline(4273):                Internet Connection found.
07-09 12:39:40.820: I/Requestd Connection(4273):        http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?
07-09 12:39:44.609: I/Server Response:(4273):           <TD ID="LGFLAG">S</TD><TD ID="LGMSG"></TD><TD ID="CLNT_0">CLNTXXX,EF TEST,C,001,</TD>
07-09 12:39:44.613: I/Session Id:(4273):                ASPNETSESSIONID=zkuus2n304jnkubi4e1nqnuw
07-09 12:39:44.714: I/JupiterMPro(4273):                onCreate executes ...
07-09 12:39:45.140: I/MSMarket(4273):                   Creating activity...
07-09 12:39:45.202: I/JupiterMPro(4273):                onStart executes ...
07-09 12:39:45.202: I/JupiterMPro(4273):                onResume executes ...
07-09 12:39:45.241: I/MSMarket, Requested URL:(4273):   http://demo.excelforce.com.my/mobiletraderjssb/mtjvg.aspx?marketsummary&msg=1&brd=0
07-09 12:39:45.601: I/MSLogin(4273):                    onStop executes ...
07-09 12:39:46.702: I/MSMarket, Response code:(4273):   200
07-09 12:39:46.718: I/MSMarket, Server Response:(4273): 50,9/7/2012*12:39 PM#1619.61&-0.94&0&448.392m&399.033m&264&331&293&682&1&V
07-09 12:39:46.855: I/Timer(4273):                      Timer executes...
07-09 12:39:46.855: I/Timer(4273):                      seconds elapsed: 1
07-09 12:39:47.757: I/Timer(4273):                      Timer executes...
07-09 12:39:47.761: I/Timer(4273):                      seconds elapsed: 2
07-09 12:39:48.757: I/Timer(4273):                      Timer executes...
07-09 12:39:48.761: I/Timer(4273):                      seconds elapsed: 3

但是,当我通过 3G 服务和 Android 版本 4.0.3 和 4.0.4 连接到互联网时,我在 logcat 中的输出是这样的:

07-09 14:19:15.395: I/JupiterMPro(4750): onCreate executes ...
07-09 14:19:15.410: I/MSBootUp(4750): inside onCreate();
07-09 14:19:15.465: I/MA_isOnline(4750): Checking Internet Connection...
07-09 14:19:15.465: I/MA_isOnline(4750): Internet Connection found.
07-09 14:19:15.560: I/JupiterMPro(4750): onDestroy executes ...
07-09 14:19:43.765: I/MA_isOnline(4750): Checking Internet Connection...
07-09 14:19:43.765: I/MA_isOnline(4750): Internet Connection found.
07-09 14:19:44.015: I/Requestd Connection(4750): http://demo.excelforce.com.my/mobiletraderjssb/dopwd.aspx?
07-09 14:20:09.350: I/Server Response:(4750): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
07-09 14:20:09.350: I/Server Response:(4750):     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
07-09 14:20:09.350: I/Server Response:(4750): <html xmlns="http://www.w3.org/1999/xhtml">
07-09 14:20:09.350: I/Server Response:(4750): <head>
07-09 14:20:09.350: I/Server Response:(4750): <title></title>
07-09 14:20:09.350: I/Server Response:(4750): </head>
07-09 14:20:09.350: I/Server Response:(4750): <body>
07-09 14:20:09.350: I/Server Response:(4750): <table>
07-09 14:20:09.350: I/Server Response:(4750): <tr>
07-09 14:20:09.350: I/Server Response:(4750): <td id="LGFLAG">S</td>
07-09 14:20:09.350: I/Server Response:(4750): <td id="LGMSG"></td>
07-09 14:20:09.350: I/Server Response:(4750): <td id="CLNT_0">CLNTXXX,EF TEST,C,001,</td>
07-09 14:20:09.350: I/Server Response:(4750): </tr>
07-09 14:20:09.350: I/Server Response:(4750): </table>
07-09 14:20:09.350: I/Server Response:(4750): </body>
07-09 14:20:09.350: I/Server Response:(4750): </html>
07-09 14:20:09.350: I/postData()(4750): HTML found instead of XML. Try to extract info...
07-09 14:20:09.365: I/Extracted info(4750): <TD ID="LGFLAG">S</TD>
07-09 14:20:09.365: I/Extracted info(4750): <TD ID="LGMSG"></TD>
07-09 14:20:09.365: I/Extracted info(4750): <TD ID="CLNT_0">CLNTXXX,EF TEST,C,001,</TD>
07-09 14:20:09.460: I/JupiterMPro(4750): onCreate executes ...
07-09 14:20:09.510: I/webclipboard(4750): clipservice: android.sec.clipboard.ClipboardExManager@41994c30
07-09 14:20:09.615: I/MSMarket(4750): Creating activity...
07-09 14:20:09.685: I/JupiterMPro(4750): onStart executes ...
07-09 14:20:09.685: I/JupiterMPro(4750): onResume executes ...
07-09 14:20:09.755: I/MSMarket, Requested URL:(4750): http://demo.excelforce.com.my/mobiletraderjssb/mtjvg.aspx?marketsummary&msg=1&brd=0
07-09 14:20:10.030: I/MSLogin(4750): onStop executes ...
07-09 14:20:11.350: I/MSMarket, Response code:(4750): 200
07-09 14:20:11.365: I/MSMarket, Server Response:(4750): 50,9/7/2012*2:20 PM#1619.61&-0.94&0&448.392m&399.033m&264&331&293&682&1&P

其实,我不知道这段 HTML 代码是从哪里来的!因为为了连接3G,移动运营商会自动为手机设置代理。我们怀疑代理设置。有人在Java, does proxy setting affect received data? 中提到,也许代理服务器会注入此代码并包装我想要的数据。我认为这个想法是不正确的,因为在相同的情况下,当我为两个 Android V2.0 使用一张 sim 卡 (3G) 时。 V3.0 和 v4.0 虽然代理设置对所有这些都相同,但我在 v4.0 中收到错误的数据。我猜想 Android v4.0 的 HttpPost 库有问题!

这里发生了什么?此代码适用于 v4.0 以下的 Android,但不适用于 Android v4.0 及更高版本!

你有过这样的经历吗?你做了什么? 任何建议,将不胜感激。谢谢

【问题讨论】:

  • 您能否描述一下代码运行时在 android 4.0 上会发生什么?你也可以给一个链接到一个崩溃的网址吗?
  • 谢谢亲爱的Warpzit,实际上没有崩溃和应用程序工作。但我有意外的数据包装了我的数据。我们认为可能是因为移动服务提供商在移动设备上自动设置代理设置。但是,这似乎是不正确的,因为当我在 Android 2.2 或 3.0 上运行该应用程序时,它可以正常工作而没有问题。但是,如果我在 Android 4.0(相同的 sim-card/mobile 3g 服务提供商)上运行应用程序,我的 XML 数据将被 HTML 代码包装(如您在上面的日志结果中所见)。因此,它表明代理服务器没有操纵代码。
  • 因此,唯一的区别是 Android 操作系统,我认为 Android v4.0 有问题
  • 我很确定 android 4.0 不会用 html 代码包装 httpget...这几乎会破坏所有使用 httpget 的东西。一定还有别的东西可以看。
  • 你能尝试给出 httpget 2.3 和 4.0 的示例输出吗?

标签: android operating-system http-post 3g


【解决方案1】:

您是否考虑过该问题是否与running a network operation on the main thread 有关? 您不能在蜂窝 (3.0) 和转发的主线程上执行网络操作。

【讨论】:

  • 当然你是对的,我知道这条规则,上面的所有代码都在 doInBackground() 方法的 AsyncTask 类下运行。这不是我的问题。但是,感谢您分享您的想法 :)
【解决方案2】:

你必须使用 AsycTask

http://developer.android.com/reference/android/os/AsyncTask.html

或一个新的线程来管理 http 连接。 您不能使用主踏板拨打电话。

AsyctTask 和 Thread 基本相同,但 AsycTask 实现了 4 个基本方法。

onPreExecute()、onPostExecute、onProgressUpdate 和 doInBackground。

试一试,告诉我们它是否有效。

【讨论】:

  • 当然你是对的,我知道这条规则,上面的所有代码都在 doInBackground() 方法的 AsyncTask 类下运行。这不是我的问题。但是,感谢您分享您的想法:)
  • 我会尝试一些东西并给你另一种方法。希望你顺便解决一下。 :)
猜你喜欢
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多