Android, что-то не так с методом HttpPost в Android 4.0?

Несколько лет назад я разработал приложение. В каждом действии я использовал метод HttpPost для отправки некоторых параметров на сервер. Он работает нормально с услугой 3G на всех устройствах с Android ниже версии 4.0. Мой код такой:

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 (который я могу получить на ОС Android ниже версии 4.0):

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 влияет ли настройка прокси-сервера на полученные данные? упомянул, что возможно, прокси-сервер вводит этот код и обертывает нужные мне данные. Я думаю, что эта идея неверна, потому что в одной и той же ситуации, когда я использую одну сим-карту (3G) для обоих Android V2.0. V3.0 и v4.0, в то время как настройки прокси-сервера одинаковы для всех из них, я получаю неверные данные в v4.0. Я предполагаю, что что-то с библиотекой HttpPost для Android v4.0 не так!

Что здесь происходит? Этот код работает на Android ниже версии 4.0, но не работает на Android версии 4.0 и выше!

Был ли у вас подобный опыт? Что ты сделал? Мы ценим любые предложения. Спасибо


person Hesam    schedule 09.07.2012    source источник
comment
Не могли бы вы дать описание того, что происходит на андроиде 4.0 при запуске кода? Также не могли бы вы дать ссылку на URL-адрес, который терпит крах?   -  person Warpzit    schedule 09.07.2012
comment
Спасибо уважаемый Warpzit, На самом деле краша нет и приложение работает. но у меня есть неожиданные данные, которые обертывают мои данные. Мы подумали, что это может быть из-за оператора мобильной связи, который автоматически устанавливает настройки прокси на мобильных устройствах. Однако кажется, что это неправильно, потому что когда я запускаю приложение на Android 2.2 или 3.0, оно работает без проблем. Но если я запущу приложение на Android 4.0 (та же сим-карта/поставщик мобильных услуг 3g), мои XML-данные будут завернуты в HTML-код (как вы можете видеть в приведенных выше результатах журнала). Следовательно, он показывает, что прокси-сервер не манипулирует кодом.   -  person Hesam    schedule 09.07.2012
comment
Поэтому разница будет только в ОС Android и я думаю, что что-то не так с Android v4.0   -  person Hesam    schedule 09.07.2012
comment
Я почти уверен, что Android 4.0 не обертывает httpget html-кодом... это в значительной степени сломает все, что использует httpget. Должно быть что-то еще, на что вы могли бы посмотреть.   -  person Warpzit    schedule 09.07.2012
comment
Не могли бы вы привести пример вывода httpget с 2.3 и 4.0?   -  person Warpzit    schedule 09.07.2012
comment
Я помещаю эти выводы в свой вопрос. первый — это код, второй — ответ в версии 2.3, а третий — ответ в версии 4.0. Вам нужно что-то еще? Спасибо за подписку на меня :)   -  person Hesam    schedule 09.07.2012
comment
давайте продолжим это обсуждение в чате   -  person Warpzit    schedule 09.07.2012


Ответы (2)


Рассматривали ли вы, может ли проблема быть связана с выполнением сетевой операции в основном потоке? Вы не можете выполнять сетевые операции в основном потоке из соты (3.0) и далее.

person Warpzit    schedule 09.07.2012
comment
определенно вы правы, я знаю это правило, и весь приведенный выше код выполняется в классе AsyncTask в методе doInBackground(). Это не моя проблема. Тем не менее, спасибо, что поделились своей идеей :) - person Hesam; 09.07.2012

Вы должны использовать AsycTask

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

или новый поток для управления http-соединениями. Вы не можете использовать основной протектор, чтобы сделать звонок.

AsyctTask и Thread в основном одинаковы, но AsycTask реализует 4 основных метода.

onPreExecute(), onPostExecute, onProgressUpdate и doInBackground.

Попробуйте их и сообщите нам, если это сработало.

person axierjhtjz    schedule 09.07.2012
comment
определенно вы правы, я знаю это правило, и весь приведенный выше код выполняется в классе AsyncTask в методе doInBackground(). Это не моя проблема. Тем не менее, спасибо, что поделились своей идеей :) - person Hesam; 09.07.2012
comment
Я попробую кое-что и дам вам другой подход. Надеюсь, вы решите это, кстати. :) - person axierjhtjz; 09.07.2012