android笔记-访问网络出现NetworkOnMainThreadException

在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

成功获取到数据!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容