Pull解析xml,在线升级中的获取服务器版本与本地版本比较

来源:互联网 发布:php o2o商城系统 编辑:程序博客网 时间:2024/06/16 17:48

大概流程:Android客户端去访问服务器上的封装了版本号等信息的xml文件,对服务器上的版本和当前版本进行比较,

如果低于服务器的版本,则下载服务器上的新版软件,进行安装替换,完成升级。


一、首先用tomcat搭建服务器,用于开发测试。

下载tomcat请参考:http://blog.csdn.net/only_tan/article/details/25110625

1.在tomcat中新建自己的项目:

\apache-tomcat-6.0.39\webapps 目录下新建自己的项目文件夹,如myapp

然后在myapp文件夹中放入xml,apk等文件;

如,我的myapp项目中放入了upgrade.xml和一个Test.apk文件;

2.访问自己的项目:

PC浏览器打开xml:http://localhost:8080/myapp/upgrade.xml

Android设备打开xml:http://10.0.2.2:8080/myapp/upgrade.xml(或将10.0.2.2换成本机IP)

打开apk文件方法同理,正常情况会弹出下载对话框。

如,Test.apk的下载地址http://10.0.2.2:8080/myapp/Test.apk

如果tomcat中的文件不可下载(如apk等)访问错误,解决如下:

方法1:

把要下载的文件放到tomcat/webapps/ROOT目录下,访问http://本机IP:8080/下载的文件名(或http://10.0.2.2:8080/文件名);

方法2:在apache-tomcat-6.0.39\conf\web.xml中添加以下内容:

<mime-mapping> <extension>doc</extension><mime-type>application/msword</mime-type> </mime-mapping> <mime-mapping> <extension>xls</extension> <mime-type>application/msexcel</mime-type> </mime-mapping> <mime-mapping> <extension>pdf</extension> <mime-type>application/pdf</mime-type> </mime-mapping><mime-mapping> <extension>zip</extension> <mime-type>application/zip</mime-type> </mime-mapping><mime-mapping> <extension>rar</extension> <mime-type>application/rar</mime-type> </mime-mapping><mime-mapping> <extension>txt</extension> <mime-type>application/txt</mime-type> </mime-mapping><mime-mapping> <extension>chm</extension> <mime-type>application/mshelp</mime-type></mime-mapping>
保存,然后重启tomcat即可。

二、访问服务器,解析xml文件内容;

1.服务器上的xml文件内容:(里面主要有3个元素,版本号、url地址、相关信息)

<upgrade><version>2</version><url>http://10.0.2.2:8080/myapp/Test.apk</url><about>版本更新至2.0,谢谢!</about></upgrade>

 2. 新建一个实体类:(针对xml内容,封装需要得到的版本等元素)

public class UpdataInfo {    private int version;      private String url;      private String about;          public int getVersion() {          return version;      }      public void setVersion(int version) {          this.version = version;      }      public String getUrl() {          return url;      }      public void setUrl(String url) {          this.url = url;      }      public String getAbout() {          return about;      }      public void setAbout(String about) {          this.about = about;      }      }
3.用pull解析器解析xml内容;(需传入一个InputStream)
    public UpdataInfo getUpdataInfo(InputStream is) throws Exception{                  UpdataInfo info = null;        XmlPullParser  parser = Xml.newPullParser();            parser.setInput(is, "GB2312");//设置解析的数据源,编码格式           int event = parser.getEventType();          while(event != XmlPullParser.END_DOCUMENT ){              switch (event) {              case XmlPullParser.START_DOCUMENT: //开始解析                    //可在此做初始化相关工作                    info = new UpdataInfo();Log.i("UpdatePullParser", "--START_DOCUMENT--");                      break;                 case XmlPullParser.START_TAG:  Log.i("UpdatePullParser", "--START_TAG--");                 String tag = parser.getName();                if("version".equals(tag)){                      info.setVersion(new Integer(parser.nextText())); //获取版本号                  }else if ("url".equals(tag)){                      info.setUrl(parser.nextText()); //获取url地址                  }else if ("about".equals(tag)){                      info.setAbout(parser.nextText()); //获取相关信息                  }                  break;              case XmlPullParser.END_TAG://读完一个元素,如有多个元素,存入容器中                  break;            default:                 break;            }              event = parser.next();          }                return info;   //返回一个UpdataInfo实体    }

4.获取xml内容,返回一个InputStream,以便解析所需; 

  public InputStream getXml() throws Exception {  String TAG="URLConnect";         String httpUrl = "http://10.0.2.2:8080/myapp/upgrade.xml";                HttpURLConnection conn = (HttpURLConnection)new URL(httpUrl).openConnection();        conn.setReadTimeout(5*1000);  //设置连接超时的时间  //    conn.setRequestMethod("GET");        conn.connect(); //开始连接        if(conn.getResponseCode() == 200){            InputStream is = conn.getInputStream();            return is;   //返回InputStream         } else {  Log.e(TAG, "---连接失败---");        }        conn.disconnect(); //断开连接        return null;    }
5.在某个触发事件中进行调用,得到服务器的版本号;

 private int mLocalVersion = 1;  //本地版本 private int mServerVersion = 2; //服务器版本//调用获得和解析xml的方法,(异步或线程中操作);private void check(){       new Thread(){            @Override            public void run(){            //需要在线程执行的方法                try {                 InputStream is = getXml();   //获取xml内容                 UpdataInfo info = getUpdataInfo(is);  //调用解析方法mServerVersion = info.getVersion();  //获得服务器版本 Log.i(TAG, "check--infoVersion="+info.getVersion()+"infoURL="+info.getUrl()         +"infoAbout="+info.getAbout());                } catch (Exception e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                  //给handler发送一个消息            mHandler.sendEmptyMessage(new Message().what=1);            }            }.start();}//Handler消息接收机制 private Handler mHandler =new Handler(){   //Handler接收到相应消息进行刷新ui等操作    public void handleMessage(Message msg){    super.handleMessage(msg);        if(msg.what == 1){      //收到消息,在此进行ui相关操作,如将解析的内容显示出来。        }         }  };
6.获取本地版本号,与服务器的版本号对比;
//获取本地版本方法    void getLocal(){        PackageInfo packageInfo;        try {            packageInfo = getApplicationContext()                    .getPackageManager().getPackageInfo(getPackageName(), 0);            mLocalVersion = packageInfo.versionCode;        } catch (NameNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }
到这里,服务器的版本号和本地版本号都已有了,剩下的就是比较大小;    

 if(mLocalVersion < mServerVersion){                      //有新版本,需要升级                  } else {                      //不需升级                  }

------------------------------OK先记录到这里,有空再继续-------------------thanks!-------------------




1 0
原创粉丝点击