2013-11-02 4 views
5

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

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

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

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

предпочтение: и мой андроид предпочтение

<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/

+3

использовать нить или AsyncTask. это должно выполняться в потоке 'HttpResponse httpResponse = httpClient.execute (httpPost);' http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – Raghunandan

ответ

11

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

Ваш код, который подключается к URL должен быть выполнен, например, в AsyncTasksdoInBackground() метод, от UI-Thread.

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

7

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

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(); 
3

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

StrictMode.ThreadPolicy policy = new 
StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
Смежные вопросы