android 远程下载与pull解析技术

在android的应用开发中,我们常常会在项目开发的过程中遇到这样的需求:开发一个某移动应用客户端。这时,常常要从服务器获取我们所需要的数据。然后实时的显示在我们的客户端。

 

好吧,不多说了,切入主题!

第一次发表android技术博文,这里说的是基于android 的远程下载机制。与google官方推荐的我们SDK内置的pull解析技术。当然还有SAX,等解析技术。

首先,介绍HTTP GET请求,我们通过HTTP GET 请求便可从指定的服务器端获取相应的数据。如我在项目中与百度公司合作,从百度服务器端获取数据,而response返回包则以xml文件的形式把数据返回给我们。当然,还有的是以html的形式返回给我们。常见在web开发,及J2EE中可以用到。

代码如下:

//注,我们采用GET方式请求数据,POST,等其他方式请大神们自己GOOGLE了解下。随处可见。。。

//远程下载数据通常比较耗时,所以,我们采用异步处理机制去进行下载工作。把

下载服务器数据把在后台处理.

public class DownloadXML extends AsyncTask<String, Void, Void>{

 getXML(); 

  return null;
 }

 @Override
 protected void onPostExecute(Void result) {
  // TODO Auto-generated method stub
  Log.d(TAG, "onPostExecute---->");
  super.onPostExecute(result);
 }

 @Override
 protected void onPreExecute() {
  // TODO Auto-generated method stub
  Log.d(TAG, "onPreExecute---->");
  showLoaderDialog(mContext);
  super.onPreExecute();
 }
 
 
 private void showLoaderDialog(Context context){
     progressDialog = new ProgressDialog(context);
        progressDialog.setTitle(context.getResources().getString(R.string.prompt));
        progressDialog.setIcon(R.drawable.icon);
        progressDialog.setMessage(context.getResources().getString(R.string.connect_server));
        progressDialog.setIndeterminate(false);
        progressDialog.setCancelable(true);
        progressDialog.setProgress(10);
        progressDialog.setMax(100);
        progressDialog.show();
    }

public void getXML() throws Exception{
   OutputStreamWriter writer = null;
  
   //get url and page encode
   String path = "http://192.168.1.123/oa/apk/action.apk"

   try{
    String xml = getXmlContent(path, "UTF-8");
    //建立一个文件输出流,准备将得到的字符串存到本地的手机上。
    File board_file = new File(Utility.getSDCardPath(), "board.xml");
    FileOutputStream outStream = new FileOutputStream(board_file);
     //准备写出输出流
    if(Environment.getExternalStorageState()==Environment.MEDIA_MOUNTED){
     writer = new  OutputStreamWriter(outStream);
      //将xml字符串写到文件里面去
      writer.write(xml);
      //写完之后,推出去。用文件浏览器看看有没有保存到文件~~~
      Log.i(TAG, xml); 
      writer.flush();
      writer.close();
    }
    
   }catch (IOException e) {
   // TODO: handle exception
    e.printStackTrace();
    showErrorDialog();
   }  
  }

 private String getXmlContent(String path, String encoding) throws Exception{
  
   //将字符串形式的path,转换成一个url
   URL url = new URL(path);
   //得到url之后,将要开始连接网络
  //首先,实例化一个HTTP连接对象conn
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   //定义请求方式为GET,其中GET的大小写不要搞错了。
     conn.setRequestMethod("GET");
     //定义请求时间,在ANDROID中最好是不好超过10秒。否则将被系统回收。
     conn.setConnectTimeout(6*1000);
     //请求成功之后,服务器会返回一个响应码。如果是GET方式请求,服务器返回的响应码是200,
     //post请求服务器返回的响应码是206(貌似)。
     Log.d(TAG,"THE CODE == "+conn.getResponseCode());
     if(conn.getResponseCode()==200){
    //从服务器传递过来数据,是一个输入的动作。定义一个输入流,获取从服务器返回的数据
      InputStream input = conn.getInputStream();
      //得到输入流的数据之后,调用readStream方法对输入流进行处理。返回的一个字节数组。
      byte[] data = readStream(input);
      Log.d(TAG,"the data= "+new String(data,encoding));
      return new String(data,encoding);
     }
     return null;
  }

public byte[] readStream(InputStream inStream) throws Exception{
     //readStream获得了传递进来的输入流
     //要返回输入流,就需要定义一个输出流。
     //定义一个字节数组型的输出流,ByteArrayOutputStream
     ByteArrayOutputStream outStream = new ByteArrayOutputStream();
     //建立一个缓冲区buffer
     byte[] buffer = new byte[4*1024];
     int len= -1;
     //将输入流不断的读,并放到缓冲区中去。直到读完
     while((len=inStream.read(buffer))!=-1){
      //将缓冲区的数据不断的写到内存中去。边读边写
      outStream.write(buffer, 0, len);
     }
     outStream.close();
     inStream.close();
     //将输出流以字节数组的方式返回
     return outStream.toByteArray();
    }

 

 

再者,讲讲PULL解析技术,在android源码中,我们可以看到一个内置的xml解析器,就是PULL解析,有兴趣的大神们可以去了解一下。与SAX技术,很相近,两者都是通过事件驱动来进行解析的,当走到文档的START_DOCUMENT 时,触发一个事件,回调相应的方法去处理。而PULL则是返回一个整型值。int event=parser.getEventType(); 这个整形值就代表事件类型,也即是文档的TAG标签。

代码如下:

下面以person.xml为解析对象:

<persons>

<person>

<id>1</id>

<name>zhangshang</name>

<sex>男</sex>

<age>22</age>

</person>

<person>

<id>2</id>

<name>李四</name>

<sex>女</sex>

<age>20</age>

</person>

</persons>

public List<Persons> getPersons(InputStream inputStream) throws Throwable 
    { 
        List<Persons> persons=null; 
        Persons person=null; 
        XmlPullParser parser=Xml.newPullParser(); 
        parser.setInput(inputStream, "utf-8"); 
        int event=parser.getEventType();
       
         
        while(event!=XmlPullParser.END_DOCUMENT) 
        { 
         Log.d(TAG,"the event = "+event);
            switch (event) 
            { 
                case XmlPullParser.START_DOCUMENT: 
                    persons=new ArrayList<Persons>();
                    break; 
                case XmlPullParser.START_TAG: 
                    if("person".equals(parser.getName())) 
                    { 
                        person=new Persons(); 
                        Integer id=new Integer(parser.getAttributeValue(0)); 
                        person.setId(id); 
                    } 
                    if(person!=null) 
                    { 
                        if("name".equals(parser.getName())) 
                        { 
                            String name=parser.nextText().toString(); 
                            person.setName(name); 
                        } 
                        else if("age".equals(parser.getName())) 
                        { 
                            int age=new Integer(parser.nextText().toString()); 
                            person.setAge(age); 
                        } 
                    } 
                    break; 
                 
                case XmlPullParser.END_TAG:  
                     
                    if("person".equals(parser.getName())) 
                    { 
                        persons.add(person); 
                        person=null; 
                    } 
                    break; 
                     
                default: 
                    break; 
            } 
            event=parser.next();  
        } 
        return persons; 
    } 

将解析后的数据放入一个List里。方便以后读取.

 

你可能感兴趣的:(android,pull解析,移动开发,http请求,休闲)