OPhone应用程序内容在线更新的新思路
RSS订阅
看到这个副标题,应该大家会很容易想到我的意图是什么吧。不错,我们可以利用RSS订阅的内容完成我们内容的更新,因为RSS订阅的内容是每天可以更新的,我们只要找到与我们软件内容相关的RSS源就可以了。另外之所以联想到RSS的另外一个原因是,当我们请求RSS源地址时,服务器返回给我们的是一个XML文档,而对于XML解析我想大家应该是非常熟悉的吧,也是一个比较简单的过程,所以说呢,这样的条件得天独厚,完成我们软件的相关内容的更新不就是小菜一碟吗?整个过程其实就是相当于完成了一个RSS阅读器,只是我们是后台进行数据提取。所以下面我就简单的用一个demo给大家说明一下。我的demo是基于星座软件,可以提供每天的星座运程,所以这里我只是简单给大家演示下我获取十二个星座每天内容,然后放在textview中显示。
XML解析的设置
这一部分内容的话主要就是关于XML解析的问题,因为我们做的是手机软件内容更新,所以需要尽可能的考虑的手机的局限性,我们需要尽可能少的消耗内存,所以我建议选择SAX解析方式,关于SAX解析我想不用太多解释,大家都知道的。下面请看:
- publicclassMyHandlerextendsDefaultHandler
- {
- String tagName;
- String[]horoStrings=new String [12];
- inti=0;
- /**开始解析节点,注意要在此时找到自己需要的内容所属节点*/
- publicvoidstartElement(String uri, String localName, String name,
- Attributes attributes) throwsSAXException {
- // TODO Auto-generated method stub
- tagName=localName;
- if(localName.equals("description"))
- {
- i++;
- }
- }
- publicvoid characters(char[] ch, int start, int length)
- throwsSAXException {
- // TODO Auto-generated method stub
- /**如果是想要的节点名,就将内容获取*/
- System.out.println("my god");
- if(tagName.equals("description"))
- {
- horoStrings[i]=new String(ch,start,length);
- }
- }
- public String [] getParseData()
- {
- returnhoroStrings;
- }
- }
简单对以上解释下,我是用一个数组把xml中的十二个星座的运程给截取下来,运程的内容是放在节点<description></description>中间,所以我查找的节点就是"description",然后在读取内容的时候我就把需要的内容放进数组中,最后再构造一个方法返回所获取的数组。然后解析方面简单的完成了。
发送请求获取资源
接下来我们需要的是向RSS源地址发送请求并得到返回的XML,然后对其进行解析:
- try{
- URL url=newURL("http://feeds.astrology.com/dailyoverview");
- SAXParserFactorysFactory=SAXParserFactory.newInstance();
- XMLReader reader=sFactory.newSAXParser().getXMLReader();
- MyHandlermyHandler=newMyHandler();
- reader.setContentHandler(myHandler);
- reader.parse(newInputSource(url.openStream()));
- String[]data= myHandler.getParseData();
- Intent intent=newIntent();
- intent.putExtra("data",data);
- intent.setClass(RSSreader.this, ShowHoroscopes.class);
- startActivity(intent);
- }
- catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
SAX解析的初始化大家应该都是熟悉的,把打开xml文件流并开始进行解析。
多线程处理
我们知道在实际运行中为了良好的用户体验,解析过程中我们需要做双线程处理,这样才不会让用户以为假死,所以我们可以前台设置一个正在解析的Dialog,这样的话,可以让用户更好的了解更新进程,所以如下:
- mydialog=ProgressDialog.show(RSSreader.this, "进度提示", "正在解析。。。。。。");
- new Thread()
- {
- publicvoid run()
- {
- try{
- URL url=newURL("http://feeds.astrology.com/dailyoverview");
- SAXParserFactorysFactory=SAXParserFactory.newInstance();
- XMLReader reader=sFactory.newSAXParser().getXMLReader();
- MyHandlermyHandler=newMyHandler();
- reader.setContentHandler(myHandler);
- reader.parse(newInputSource(url.openStream()));
- String[]data= myHandler.getParseData();
- Intent intent=newIntent();
- intent.putExtra("data",data);
- intent.setClass(RSSreader.this, ShowHoroscopes.class);
- startActivity(intent);
- }
- catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- finally
- {
- mydialog.dismiss();
- }
- }
- }.start();
- }
效果如图:
总结
虽然这种方法并不能适用于大多数应用软件的内容更新,但是对于我们这些学生开发者来说,如果想要实现一个关于内容方面的应用软件,在没有服务端的情况下,我想我们可以尝试着找到相关的RSS资源,然后借鉴这种方法达到我们想要的期望。