有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何修复Android中的NetworkonMainThreadException?

我正在为任务创建一个项目,我是Android新手,我想从非常常见的urlhttp://api.安卓hive.info/contacts/访问json

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

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

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

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

<uses-sdk
        安卓:minSdkVersion="8"
        安卓:targetSdkVersion="18" />
  1. 空气污染指数第18级
  2. 安卓4.3

这就是我试图读取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();

错误消息

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}: 安卓.os.NetworkOnMainThreadException
11-02 05:23:47.843: E/AndroidRuntime(2207):     at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at 安卓.app.ActivityThread.access$600(ActivityThread.java:141)
11-02 05:23:47.843: E/AndroidRuntime(2207):     at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)

此外,我还将按照本教程介绍ListView示例 http://www.安卓hive.info/2011/11/安卓-xml-parsing-tutorial/


共 (3) 个答案

  1. # 1 楼答案

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

    连接到url的代码应该在一个异步任务doInBackground()方法中执行,例如在UI线程下执行

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

  2. # 2 楼答案

    更新答案:

    潜在的长时间运行操作,如网络操作,应在工作线程中完成

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

    许多库可用于执行网络操作,如Volleyretrofit


    旧答案:

    在activityonCreate方法中添加以下行

    StrictMode.ThreadPolicy policy = new
    StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    
  3. # 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;
         }
    
     }
    

    在您的活动中,请使用以下代码

    new UpdateTask().execute();