如何在Android中修复NetworkonMainThreadException?

2022-09-02 08:58:03

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

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

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

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

首选项:和我的安卓首选项是

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. API 级别 18
  2. 安卓 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 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/


答案 1

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

连接到 url 的代码应在 UI 线程之外AsyncTasks 方法内执行。doInBackground()

看看这个问题,了解如何使用异步任务:如何使用异步任务


答案 2

更新的答案:

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

为较长的操作创建工作线程的最有效方法是使用 AsyncTask 类。只需扩展 AsyncTask 并实现 doInBackground() 方法来执行工作。

许多图书馆可用于进行网络操作,例如排球改造等。


旧答案:

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

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

推荐