前几天写了几篇博客和大家分享了Android开发中的一些经验。今天我们来看看另一个非常有实用价值的Android工具实例:Android端实现html网页的解析。
由于javaEE中继承了动态WEB类的开发环境,所以我们直接使用轻量级服务器Tomcat来完成网页部署,然后在安卓端上对页面内容进行获取。这个例子虽小,却是Android实现网络访问、数据获取与提交、流与字节相互转换等许多知识的基础。堪称经典范例。现在我们就来实现它。
【一】服务器端部署Web页面
首先先在eclipse的javaEE界面中新建一个Dynamic Web project,在WebContent目录中新建一个jsp的文件。
接着Run as---》 把工程部署在tomcat服务器上(此时若没有启动tomcat服务器也没有关系,新版本的jvaEE中,程序在部署时会发送开启命令)
这时,确定一下是否可以正常访问该页面:
我们还可以在箭头标注位置设置具体地址。成功后现在我们重点来看Android端的实现
PS:我们还可以再页面代码中修改charset值来选择页面编码,否则有可能显示乱码,这里我们采用UTF-8编码
【二】Android的数据流转换类的实现
首先理清思路后,我们发现,我们需要获取一个HTTP的连接池,然后得到一个inputstream的输入流,并把他转换为一个Byte数组。然后才能显示在界面上。为此,我们开发一个新类,实现上述功能。
*(当以后用到html解析时,这个类仍然有用,可以直接拷贝在工具类下作为常用方法)
以下是代码实现:
public class StreamTool { /** * 把一个inputstream里面的内容转化成一个byte[] */ public static byte[] getBytes(InputStream is) throws Exception{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while((len = is.read(buffer))!=-1){ bos.write(buffer, 0, len); } is.close(); bos.flush(); byte[] result = bos.toByteArray(); System.out.println(new String(result)); return result; } }
【三】建立连接,传递参数获取回传值
我们再新建一个工具类,在类中实现参数的传递与获取:
public class NetUtil { public static String getHtml(String address) throws Exception { URL url = new URL(address); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(5000); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); byte[] result = StreamTool.getBytes(is); String temp = new String(result); // 简单描述原理 // 真实的代码需要解析meta里面的信息 if (temp.contains("gbk")) { return new String(result, "gb2312"); } else { return temp; } } else { throw new IllegalStateException("访问网络失败"); } } }
代码中的if语句的作用,是判断网页代码的编码格式,从而实现最佳的浏览体验。当然,这只是一个简单的实现范例,并没有仔细考虑效率和开销。不过大家有没有发现一些解码灵感~ XD
【四】交互前端的实现
很简单的一个线性布局,注册点击时间后就可以访问网络了:
public void onClick(View v) { switch (v.getId()) { case R.id.bt_view: //按钮对应的点击事件 String address = mEtAddress.getText().toString().trim(); if("".equals(address)){ Toast.makeText(this, "地址不能为空", Toast.LENGTH_SHORT).show(); return; } try { String html = NetUtil.getHtml(address); mTvView.setText(html); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "获取数据失败", 0).show(); } break; } }
ok了!,一个网页查看器就做成功了。在此基础上,大家还可以做许多扩展,例如图片查看、音乐下载...
源码已上传,地址见回复~