Java 如何修复 Android 中的 NetworkonMainThreadException?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19740604/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 19:51:01  来源:igfitidea点击:

How to fix NetworkonMainThreadException in Android?

javaandroidnetworkonmainthread

提问by zzlalani

I'm creating an project for assignment, I'm new to Android, and I wanted to access json from very common url http://api.androidhive.info/contacts/,

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

Problem:I'm trying to read the url and fetch and parse the json returned by this url,

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

I've already added following line into my AndroidManifest.xml

我已经将以下行添加到我的 AndroidManifest.xml 中

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

Preferences:and my android preferences are

首选项:我的 android 首选项是

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
  1. Api level 18
  2. Android 4.3
  1. API 级别 18
  2. 安卓 4.3

and this is how I'm trying to read the url

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

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();

The Error Message

错误信息

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.access0(ActivityThread.java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)

Also I'm following this tutorial for ListView Example http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

此外,我正在关注本教程的 ListView 示例 http://www.androidhive.info/2011/11/android-xml-parsing-tutorial/

采纳答案by Philipp Jahoda

Your Exceptionactually tells you exactly what you are doing wrong. You are not using another threadto perform NetworkOperations. Instead, you perform the network operation on your UI-Thread, which cannot (does not) work on Android.

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

Your code that connects to the url should be executed for example inside an AsyncTasksdoInBackground()method, off the UI-Thread.

连接到 url 的代码应该在AsyncTasksdoInBackground()方法中执行,例如在UI 线程之外。

Take a look at this question on how to use the AsyncTask: How to use AsyncTask

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

回答by Jitesh Dalsaniya

Use following code.

使用以下代码。

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

 }

and in your ManinActivity Use following code.

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

new UpdateTask().execute();

回答by Giru Bhai

Updated Answer:

更新答案:

Potentially long running operations such as networkoperations should be done in a worker thread.

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

The most effective way to create a worker thread for longer operations is with the AsyncTaskclass. Simply extend AsyncTaskand implement the doInBackground()method to perform the work.

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

Many libraries are available to do network operations such as Volley, retrofitetc.

许多库可用于执行网络操作,例如Volley改造等。



Old Answer:

旧答案:

Add following lines in your activity onCreatemethod

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

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