如何在Android中修复NetworkonMainThreadException?

zzl*_*ani 14 java android networkonmainthread

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

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

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

<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

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

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
Run Code Online (Sandbox Code Playgroud)
  1. Api等级18
  2. Android 4.3

这就是我试图读取网址的方式

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();
Run Code Online (Sandbox Code Playgroud)

错误消息

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)
Run Code Online (Sandbox Code Playgroud)

另外,我正在按照ListView示例http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/学习本教程 .

Phi*_*oda 18

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

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

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


Gir*_*hai 11

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

StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Run Code Online (Sandbox Code Playgroud)


Jit*_*iya 9

使用以下代码.

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;
     }

 }
Run Code Online (Sandbox Code Playgroud)

并在您的ManinActivity中使用以下代码.

new UpdateTask().execute();
Run Code Online (Sandbox Code Playgroud)