Как исправить NetworkonMainThreadException в Android?

Я создаю проект для назначения, я новичок в Android, и я хотел получить доступ к json с очень общего URL http://api.androidhive.info/contacts/,

Проблема: я пытаюсь прочитать URL, извлечь и проанализировать JSON, возвращенный этим URL,

Я уже добавил следующую строку в мой AndroidManifest.xml

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

Предпочтения: и мои предпочтения Android

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. API уровень 18
  2. Android 4.3

и вот как я пытаюсь прочитать URL

static InputStream is = null;

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

Сообщение об ошибке

11-02 05:23:47.843: E/AndroidRuntime(2207): FATAL EXCEPTION: main
11-02 05:23:47.843: E/AndroidRuntime(2207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.me.countrypedia/com.me.countrypedia.MainActivity}: android.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)

Кроме того, я следую этому руководству для примера ListView http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

Ответ 1

Ваш Exception на самом деле говорит вам, что именно вы делаете неправильно. Вы не используете другой поток для выполнения NetworkOperations. Вместо этого вы выполняете сетевую операцию в своем пользовательском интерфейсе, который не работает (не работает) на Android.

Ваш код, который подключается к URL-адресу, должен быть выполнен, например, внутри метода AsyncTasks doInBackground(), от пользовательского интерфейса.

Взгляните на этот вопрос о том, как использовать AsyncTask: Как использовать AsyncTask

Ответ 2

Старый ответ:

Добавьте следующие строки в свой метод onCreate своей деятельности

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

Обновленный ответ:

Потенциально длительные операции, такие как сетевые операции, должны выполняться в рабочем потоке.

Наиболее эффективный способ создания рабочего потока для более длительных операций - это класс AsyncTask. Просто расширьте AsyncTask и реализуйте метод doInBackground() для выполнения работы.

Ответ 3

Используйте следующий код.

private class UpdateTask extends AsyncTask<String, String,String> {
     protected String doInBackground(String... urls) {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
        return null;
     }

 }

и в вашем ManinActivity Используйте следующий код.

new UpdateTask().execute();