关于java:如何在Android中修复NetworkonMainThreadException?

How to fix NetworkonMainThreadException in Android?

本问题已经有最佳答案,请猛点这里访问。

我正在创建一个分配项目,我是Android新手,我想从非常常见的url http://api.androidhive.info/contacts/访问json,

问题:我正在尝试读取url并获取并解析此url返回的json,

我已经在我的AndroidManifest.xml中添加了以下行

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

首选项:和我的Android首选项是

1
2
3
<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  • Api等级18
  • Android 4.3
  • 这就是我试图读取网址的方式

    1
    2
    3
    4
    5
    6
    7
    8
    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();

    错误消息

    1
    2
    3
    4
    5
    6
    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示例的本教程

    Android XML Parsing Tutorial


    你的Exception实际上告诉你你做错了什么。您没有使用其他线程来执行NetworkOperations。相反,您在UI-Thread上执行网络操作,这不能(不)在Android上运行。

    连接到url的代码应该在例如UI-Thread之外的AsyncTasks doInBackground()方法中执行。

    看看这个关于如何使用AsyncTask的问题:如何使用AsyncTask


    更新答案:

    网络操作等潜在的长时间运行应该在工作线程中完成。

    为更长时间的操作创建工作线程的最有效方法是使用AsyncTask类。只需扩展AsyncTask并实现doInBackground()方法即可完成工作。

    许多图书馆都可以进行网络操作,如Volley,改造等。

    旧答案:

    在您的活动onCreate方法中添加以下行

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


    使用以下代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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中使用以下代码。

    1
    new UpdateTask().execute();