2012-07-31 5 views
3

У меня есть код ниже:Android HttpClient: NetworkOnMainThreadException

protected void testConnection(String url) { 
    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 
    ResponseHandler<String> responsehandler = new BasicResponseHandler(); 

    try { 
     String connection = httpclient.execute(httpget, responsehandler); 
     Toast.makeText(getBaseContext(), R.string.connection_succeed, Toast.LENGTH_SHORT).show(); 
     view_result.setText(connection); 
    } catch(IOException e) { 
     Toast.makeText(getBaseContext(), R.string.connection_failed, Toast.LENGTH_SHORT).show(); 
    } 
    httpclient.getConnectionManager().shutdown(); 
} 

и добавить разрешение в Menifest:

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

Но это идет исключение: NetworkOnMainThreadException, Как я могу это сделать?

+0

Запустите этот метод не в потоке пользовательского интерфейса. Например, в AsyncTask ot thread –

+0

Просмотрите мое сообщение о ** ['NetworkOnMainThreadException'] (http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html) **. Это объясняет, почему это может произойти. –

+0

Возможный дубликат [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

ответ

7

В ICS и более поздних версиях вы больше не можете выполнять сетевые операции в потоке пользовательского интерфейса. Вместо этого вы вынуждены создавать новый поток и создавать свои сетевые материалы.

Возможные инструменты: Android AsyncTask и обычная Java Thread.

Хороший учебник можно найти здесь: Android Threads, Handlers and AsyncTask - Tutorial

1

Начиная с API 11, вы не можете манипулировать сетевыми (отнимающими много времени) операциями на главной нить. Для выполнения таких операций используйте AsyncTask или Thread.

1

Вы не можете выполнять сетевые операции в потоке событий, так как андроид уровня Api 11. Вместо этого вы должны сделать работу сети в другом потоке, потоке событий, и использовать обработчик или Asynctask для этого.

0

Я запустил ваш код в android 2.x и его нижней версии, я думаю, что этот код будет работать отлично. Но если вы запустите это в 3.x, и это верхняя версия, вы получите исключение. Проблема в том, что вам нужно вызвать веб-службу из рабочего потока (AsyncTask <>). Вы не можете вызвать веб-службу из основного потока.