AndroidWeb访问的问题
好长时间不写Android,但是最近在做一个Android的项目,需要访问到Web页面,由于以前处于通用性的考虑,一般都把Android的最低版本设置在android2.2 Or android2.3但是现在的项目需要访问Web的Json页面,由于Android从3.0之后才支持Json的解析,所以索性我就minLevel设定成了android4.0,可是在访问Web的时候总是会有问题,为什么呢,我在2.3时访问Web的代码完全Ok啊。。。
后来几经周折,将Android的Exception的类型弄出来了为
android.os.NetworkOnMainThreadException
百度一下才发现从Android3.0之后就不能在主进程中进行Web的访问,要放到线程中去
网上有很多线程的设计方法,我就贴出一种我最喜欢的
主线程代码 mHandler = new Handler() { @Override public void handleMessage(Message msg) { Toast.makeText(MainActivity.this, reM, Toast.LENGTH_LONG).show(); super.handleMessage(msg); } }; new MyThread().start();
子线程代码 public class MyThread extends Thread { public void run() { try { URL url = new URL("http://10.10.29.187/json.html"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.connect(); if (conn.getResponseCode() == 200) { InputStream is = conn.getInputStream(); String s = inputStream2String(is); Log.d("json", s); JsonReader reader = new JsonReader(new StringReader(s)); try { // 现在开始解析 reader.beginArray();// 开始解析数组 int id = 0; String name = null; while (reader.hasNext()) { reader.beginObject();// 开始解析对象 while (reader.hasNext()) { String tagName = reader.nextName(); if (tagName.equals("PulseRate")) id = reader.nextInt(); if (tagName.equals("MeasureTime")) name = reader.nextString(); } reM += id + "\n" + name + "\n"; reader.endObject();// 结束对象解析 } reader.endArray();// 结束数组解析 } catch (IOException e) { e.printStackTrace(); } } } catch (Exception e) { // TODO: handle exception } Message msg = new Message(); msg.what = 1000; mHandler.sendMessage(msg); } }
子线程是可以共享主线程的所有变量的,这个在操作系统中大家应该学过吧。