1.控制层里面的代码:
里面有详细的注释代码
private static final String TAG="GetXMLTest";
public void getXMLTest() throws Exception {
//因为我们的NetTool函数请求网页的方式是get,那么我们的path里面就需要带参数了。
String path = "http://211.143.108.6/wap/ResCatService?act=pic&s=h";//如果参数是中文,必须进行Url进行编码
// 如URLEncoder.encode(s, enc
//将要请求的页面Path和网页的编码传递到NetTool类中,返回一个String类型的值。先看看getTextContent是怎么处理的。
String xml = NetTool.getTextContent(path, "UTF-8");
//getTextContent方法做了些什么?就是将服务器返回的数据流转换成了字符串。
//建立一个文件输出流,准备将得到的字符串存到本地的手机上。
/**先拆分一下代码:
* FileOutputStream outstream = new FileOutputStream(
* new File(Environment.getExternalStorageDirectory(),"test.xml"));
*等于一下代码
* File file1 = new File(dir, name); 实例化一个File文件
* dir参数就是Environment.getExternalStorageDirectory()
* Environment.getExternalStorageDirectory()===等于==="/sdcard"。就是手机卡的内存卡的地址
* name参数是test.xml
*然后将为file1实例化一个输出流。
* FileOutputStream Stream =new FileOutputStream(file1);
*/
FileOutputStream outstream = new FileOutputStream(
new File(Environment.getExternalStorageDirectory(),"test.xml"));
//准备写出输出流
OutputStreamWriter writer = new OutputStreamWriter(outstream);
//将xml字符串写到文件里面去
writer.write(xml);
//写完之后,推出去。用文件浏览器看看有没有保存到文件~~~~
writer.flush();
//关闭。
writer.close();
Log.i(TAG, xml);
}
2.看看业务层的代码,有两个方法
public static String getTextContent( String urlpath,String encoding) throws Exception {
//可以看到,getTextContent接收到了目前还处于字符串形似的path,和编码。
//将字符串形式的path,转换成一个url
URL url = new URL(urlpath);
//得到url之后,将要开始连接网络,以为是连接网络的具体代码
//首先,实例化一个HTTP连接对象conn
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//定义请求方式为GET,其中GET的大小写不要搞错了。
conn.setRequestMethod("GET");
//定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
conn.setConnectTimeout(6*1000);
//请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,post请求服务器返回的响应码是206(貌似)。
if(conn.getResponseCode()== 200){
//返回码为真
//从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
InputStream inStream = conn.getInputStream();
//得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
//按ctrl进入readStream方法,看看readStream是怎么处理的
byte[] data = readStream(inStream);
//得到返回值。那么readStream主要做了些什么?readStream主要处理了将服务器返回的数据写到内存这个工作,也就是保存到了本地(我觉得)。
//以字符串形式的返回。String(data,encoding)是个知识点。
return new String(data,encoding);
}
return null;
}
方法2:
public static byte[] readStream(InputStream inStream) throws Exception{
//readStream获得了传递进来的输入流
//要返回输入流,就需要定义一个输出流。
//定义一个字节数组型的输出流,ByteArrayOutputStream
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//建立一个缓冲区buffer
byte[] buffer = new byte[1024];
int len= -1;
//将输入流不断的读,并放到缓冲区中去。直到读完
while((len=inStream.read(buffer))!=-1){
//将缓冲区的数据不断的写到内存中去。边读边写
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
//将输出流以字节数组的方式返回
return outStream.toByteArray();
}
总结一下:
虽然整个代码是做出来了,但是还是要巩固一下:
回想一下整个流程:
1.得到请求服务器的url地址的参数,
2.发送请求,得到返回的响应码
3.判断响应码是不是GET方式
4.将得到的输入流读取,并返回一个字符串。
5.新建一个文件,将得到的字符串作为数据填充到文件中。
恩~~流程大概是这样的了~~~
不过,以上的流程有个鸟用。稍微有点常识的人都知道怎么做。。。。具体一点,具体一点。具体一点。
详细一点:
为什么要写那么类,那么多方法。完成这样的一个功能,完全只要一个类即可搞定。
因为~~~额~~因为什么呢~·mvc三层架构这是一个比较合理的解释吧。也有利代码的管理和重复使用不是。
好,我们开始整个获取xml流程之旅吧~·
1.得到一个url和网页的编码
2.将url和encoding传到业务层的方法gettext中
3.gettext方法中 建一个HttpURLConnection连接对象,请求服务器
4.在gettext方法中 判断返回码时候是你请求的方式,这里是200码
5.在gettext方法中 获取服务器返回的输入流
6.在readStream中 读取输入流,返回字符串
7.现在又返回到控制层
8.新建一个文件
9.新建一个文件输出流
10.将返回的字符串写到文件里
11.查看
这个比较清晰了,,,继续搞其他的~~ 就到这里吧~~
来源:http://strivermao.blog.163.com/blog/static/18155715920101123102358506/