美文网首页
android笔记-访问网络出现NetworkOnMainThr

android笔记-访问网络出现NetworkOnMainThr

作者: BrodyWu | 来源:发表于2016-07-13 17:40 被阅读758次

    在android开发过程中,网络问题是避免不了的,NetworkOnMainThreadException 是我们常见问题,以上是怎么解决问题

    #情景重现#

    button.setOnClickListener(){
           (new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   try{
                           String url = "http://www.baidu.com";
                            String json  = get(url,""utf-8);
                            System.out.println("----------获取json:-----------"+json);}
                                  }catch (Exception e) {
                    e.printStackTrace();
                }
    
                }
    }
    
    // 链接服务器
    public static String get(String urlStr, String charsetName) throws Exception {               
                  // 创建URL对象
                  URL url = new URL(urlStr);
                  // 打开链接
                  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                 // 请求方式
                conn.setRequestMethod(METHOD_GET);
                 //设置信息头属性
                conn.setRequestProperty("User-Agent","iss");
                // 超时时间
               conn.setConnectTimeout(30000);
    
               String result = "";
               if (conn.getResponseCode() == 200) {
                InputStream inputStream = conn.getInputStream();
                byte[] data = StreamUtil.readByteArray(inputStream);
                result = new String(data, charsetName);
            }
    
            System.out.println("-----------------get------------------");
            return result;
        }
    
    

    这样运行的话,是访问不了网络的。结果:出现

    android.os.NetworkOnMainThreadException
    

    **错误提示的原因,不会停止运行,但是访问不了网络

    Paste_Image.png

    **原因:不允许在主线程中进行网络访问


    **解决的一种方法:利用异步加载类AsyncTask类

    button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                  PersonTask task = new PersonTask();
                    task.execute();
                }
            });
    
    
      public class PersonTask extends AsyncTask<Void, Void, ArrayList<PersonLisInfo>> {
    
            @Override
            protected ArrayList<PersonLisInfo> doInBackground(Void... params) {
    
                try {
                    String url = "http://www.baidu.com";
                    String json = get(url,""utf-8);
                    System.out.println("---------------HttpUtil------------------");
                    System.out.println("查询结果。。。。。。" + json);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
        }
    

    **
    **运行结果:

    运行结果.png

    成功获取到数据!!!

    相关文章

      网友评论

          本文标题:android笔记-访问网络出现NetworkOnMainThr

          本文链接:https://www.haomeiwen.com/subject/yqtejttx.html