如何在 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 [重复]