您的位置:首页 > 移动开发 > Android开发

Android开发——获取服务器返回的xml文件

2012-09-09 11:00 363 查看
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.查看
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息