Ошибка при соединении с веб-сервисом - PullRequest
0 голосов
/ 30 марта 2012

я пишу этот код в main.java

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        try{
             HttpClient httpclient = new DefaultHttpClient();
             HttpPost httppost = new HttpPost("http://way2tutorial.com/json/index.php");
             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
             HttpResponse response = httpclient.execute(httppost);
             HttpEntity entity = response.getEntity();
             InputStream is = entity.getContent();
             }catch(Exception e){
                 Log.e("log_tag", "Error in http connection"+e.toString());
            }

, а также включаю

<uses-permission android:name="android.permission.INTERNET"/>

в файл манифеста

, но при запуске приложения Android возникает ошибкав http

connectionandroid.os.NetworkOnMainThreadException

Ответы [ 4 ]

0 голосов
/ 30 марта 2012

Начиная с Honeycomb, то есть 3.0 , вам больше не разрешено выполнять сетевые операции в главном потоке приложения .Вы должны создать отдельный поток для сетевых операций.Попробуйте вместо этого следующий код:

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
new Thread()
{
    public void run()
    {
        try
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://way2tutorial.com/json/index.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
        }
        catch(Exception e)
        {
            Log.e("log_tag", "Error in http connection"+e.toString());
        }
    }
}.start();
0 голосов
/ 30 марта 2012

Эта ошибка, потому что вы выполняете сетевую задачу в потоке событий. Новая версия Sdk заставила разработчика выполнять сетевые задачи в другом потоке, а не в потоке событий. Чтобы решить эту проблему, создайте отдельный поток для этой цели,

Обработчик и AsyncTask - это способы обработки задач такого типа в другом потоке, кроме EventThread,

См. Следующие ссылки для понимания потоков событий и реализации сетевых задач:

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

http://www.vogella.de/articles/AndroidPerformance/article.html

0 голосов
/ 30 марта 2012

Начиная с Honeycomb (v 3.0) вам не разрешено выполнять сетевые задачи в главном потоке. Попробуйте сделать это в AsyncTask или, если вы действительно делаете какую-то тривиальную задачу, попробуйте изменить minsdkversion в манифесте ниже 11.

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

0 голосов
/ 30 марта 2012

Вы не можете ничего сделать по сети в главном потоке вашего приложения. Вы должны запустить его в новом потоке, я рекомендую сделать это в AsyncTask. Посмотрите здесь для примера - http://developer.android.com/reference/android/os/AsyncTask.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...