在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里。方便以后读取.

转载于:https://blog.51cto.com/3982975/721300

android 远程下载与pull解析技术相关推荐

  1. Qt on Android: http下载与Json解析

    百度提供有查询 ip 归属地的开放接口,当你在搜索框中输入一个 ip 地址进行搜索,就会打开由 ip138 提供的百度框应用,你可以在框内直接输入 ip 地址查询.我查看了页面请求,提取出查询 ip ...

  2. 在Android应用中使用Pull解析XML文件(传智播客视频笔记)

    Service.java源码: package com.sinaapp.ssun.service; import java.io.InputStream; import java.io.OutputS ...

  3. Android之Pull解析XML

    一.Pull解析方法介绍 除了可以使用SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件.Pull解析器的运行方式与SAX解析器相似.它也是事件触发的.Pull解 ...

  4. Android实现XML解析技术 (转载http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html)...

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  5. Android学习笔记---15_采用Pull解析器解析和生成XML内容

    15_采用Pull解析器解析和生成XML内容 -------------------------------------- 使用SAX或者DOM或者pull解析XML文件 -------------- ...

  6. Android实现XML解析技术

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  7. :Android网络编程--XML之解析方式:SAX

    任何放置在资源(res)目录下的内容可以通过应用程序的R类访问,这是被Android编译过的,而任何放置在资产(assets)目录下的内容会保持它的原始文件格式,为了读取它们,必须使用AssetMan ...

  8. XML解析:PULL解析

    为什么80%的码农都做不了架构师?>>> 概述: PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用 ...

  9. xml解析:Sax,Dom,pull解析

    Sax 1.startDocument()文档开始 2.endDocument()文档结束 3.startElement(String namespaceURI,String localName,St ...

最新文章

  1. whereis, which, locate的区别
  2. ntu ERIC 课程笔记
  3. 12、索引在什么情况下不会被使用?
  4. 全球首个开放应用模型 OAM 开源 | 云原生生态周报 Vol. 23
  5. python 写入第二列_python读写Excel表格的实例代码(简单实用)
  6. 8.16模拟:树上算法
  7. hibernate连接数据库配置
  8. 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列
  9. Java基础(二)——面向对象
  10. oracle应用程序开发,关于Oracle 数据库应用程序开发问题
  11. HashMap和HashSet的区别?
  12. Everybody was kung-fu fighting
  13. 利用VS2005进行dump文件调试
  14. 快速排序之螺钉螺母匹配
  15. bt服务器搭建 linux_linux系统架设BT服务器的详细教程
  16. java工程师面试题大全-100%公司笔试题你都能碰到几个
  17. 蓬莱与威海的几尊塑像
  18. Web全栈开发基础(小白入门版本)
  19. oracle11g-R2数据库的逻辑备份(数据泵的导入导出)
  20. Yotta企业云盘:怎样让企业数据文档防泄密

热门文章

  1. 关于 JavaScript 浮点运算的精度解决方案
  2. 刚学vue,写的一个入门demo,时光网
  3. centos 6.7 安装php7
  4. 利用Oracle内置分析函数进行高效统计汇总
  5. 艾伟也谈项目管理,学习腾讯的产品管理之道
  6. linux iostat来对linux硬盘IO性能进行了解
  7. Silverlight C# 游戏开发:Balder的3D世界
  8. ASP.NET 路由
  9. linux下安装gcc
  10. Linux 命令(109)—— ping 命令