如何在 Android 中修复 NetworkonMainThreadException? [复制]

Posted

技术标签:

【中文标题】如何在 Android 中修复 NetworkonMainThreadException? [复制]【英文标题】:How to fix NetworkonMainThreadException in Android? [duplicate] 【发布时间】:2013-11-13 11:18:08 【问题描述】:

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

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

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

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

偏好:和我的android偏好是

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    API 级别 18 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();

错误信息

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

【问题讨论】:

使用线程或异步任务。这应该在线程上执行 HttpResponse httpResponse = httpClient.execute(httpPost); ***.com/questions/6343166/… 【参考方案1】:

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

连接到 url 的代码应该在 AsyncTasks doInBackground() 方法中执行,脱离 UI 线程。

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

【讨论】:

【参考方案2】:

更新答案:

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

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

许多库可用于进行网络操作,例如Volley、retrofit 等。


旧答案:

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

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

【讨论】:

这就像一个魅力。感谢分享。【参考方案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();

【讨论】:

以上是关于如何在 Android 中修复 NetworkonMainThreadException? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 10(适用于 Android 9)中修复无需人工交互的直接拨出电话?

如何在Android中修复相机预览(surfaceview)的正确纵横比?

如何在android java中修复sqliteException

如何修复 android.os.NetworkOnMainThread [重复]

如何在android studio中修复CameraSource预览方向

如何修复在 Android 中崩溃的活动的重新启动?