OPhone应用程序内容在线更新的新思路

徐汇业大信息中心 2011-09-25

对于大多数像我这样的小型Ophone应用程序的学生开发者来说,如果开发的是一个与内容更新有关的应用程序的话,是不会选择搭建一个服务端去完成内容的更新,一来是学生经济能力有限,二是时间有限,毕竟学习才是主要目的。但是这是不是就意味着没有解决的办法呢?我想对于部分应用程序还是有解决办法的,例如像新闻资讯类的客户端,或者有关生活休闲内容的小程序,我们可以借助别人来完成我们自己程序的内容更新,那么我们该如何做呢?


 RSS订阅
  看到这个副标题,应该大家会很容易想到我的意图是什么吧。不错,我们可以利用RSS订阅的内容完成我们内容的更新,因为RSS订阅的内容是每天可以更新的,我们只要找到与我们软件内容相关的RSS源就可以了。另外之所以联想到RSS的另外一个原因是,当我们请求RSS源地址时,服务器返回给我们的是一个XML文档,而对于XML解析我想大家应该是非常熟悉的吧,也是一个比较简单的过程,所以说呢,这样的条件得天独厚,完成我们软件的相关内容的更新不就是小菜一碟吗?整个过程其实就是相当于完成了一个RSS阅读器,只是我们是后台进行数据提取。所以下面我就简单的用一个demo给大家说明一下。我的demo是基于星座软件,可以提供每天的星座运程,所以这里我只是简单给大家演示下我获取十二个星座每天内容,然后放在textview中显示。


 XML解析的设置
  这一部分内容的话主要就是关于XML解析的问题,因为我们做的是手机软件内容更新,所以需要尽可能的考虑的手机的局限性,我们需要尽可能少的消耗内存,所以我建议选择SAX解析方式,关于SAX解析我想不用太多解释,大家都知道的。下面请看:

  1. publicclassMyHandlerextendsDefaultHandler   
  2.   {   
  3.    String tagName;   
  4.    String[]horoStrings=new String [12];   
  5.    inti=0;   
  6.    /**开始解析节点,注意要在此时找到自己需要的内容所属节点*/    
  7.    publicvoidstartElement(String uri, String localName, String name,   
  8.      Attributes attributes) throwsSAXException {   
  9.     // TODO Auto-generated method stub   
  10.     tagName=localName;   
  11.     if(localName.equals("description"))   
  12.     {   
  13.      i++;   
  14.     }   
  15.        
  16.    }   
  17.   publicvoid characters(char[] ch, int start, int length)   
  18.      throwsSAXException {   
  19.     // TODO Auto-generated method stub   
  20.    /**如果是想要的节点名,就将内容获取*/  
  21.    System.out.println("my god");   
  22.     if(tagName.equals("description"))   
  23.     {   
  24.      horoStrings[i]=new String(ch,start,length);   
  25.     }   
  26.    }    
  27.   public String [] getParseData()   
  28.   {   
  29.    returnhoroStrings;   
  30.   }   
  31.   }  


简单对以上解释下,我是用一个数组把xml中的十二个星座的运程给截取下来,运程的内容是放在节点<description></description>中间,所以我查找的节点就是"description",然后在读取内容的时候我就把需要的内容放进数组中,最后再构造一个方法返回所获取的数组。然后解析方面简单的完成了。


 发送请求获取资源
  接下来我们需要的是向RSS源地址发送请求并得到返回的XML,然后对其进行解析:

  1. try{   
  2.   URL url=newURL("http://feeds.astrology.com/dailyoverview");   
  3.   SAXParserFactorysFactory=SAXParserFactory.newInstance();   
  4.   XMLReader reader=sFactory.newSAXParser().getXMLReader();   
  5.   MyHandlermyHandler=newMyHandler();   
  6.   reader.setContentHandler(myHandler);   
  7.   reader.parse(newInputSource(url.openStream()));   
  8.   String[]data= myHandler.getParseData();   
  9.   Intent intent=newIntent();   
  10.   intent.putExtra("data",data);   
  11.   intent.setClass(RSSreader.this, ShowHoroscopes.class);   
  12.   startActivity(intent);   
  13.   }   
  14.   catch (Exception e) {   
  15.   // TODO: handle exception   
  16.   e.printStackTrace();   
  17.   }  

SAX解析的初始化大家应该都是熟悉的,把打开xml文件流并开始进行解析。


 多线程处理
  我们知道在实际运行中为了良好的用户体验,解析过程中我们需要做双线程处理,这样才不会让用户以为假死,所以我们可以前台设置一个正在解析的Dialog,这样的话,可以让用户更好的了解更新进程,所以如下:

  1. mydialog=ProgressDialog.show(RSSreader.this"进度提示""正在解析。。。。。。");   
  2.   new Thread()   
  3.   {   
  4.   publicvoid run()   
  5.   {   
  6.   try{   
  7.   URL url=newURL("http://feeds.astrology.com/dailyoverview");   
  8.   SAXParserFactorysFactory=SAXParserFactory.newInstance();   
  9.   XMLReader reader=sFactory.newSAXParser().getXMLReader();   
  10.   MyHandlermyHandler=newMyHandler();   
  11.   reader.setContentHandler(myHandler);   
  12.   reader.parse(newInputSource(url.openStream()));   
  13.   String[]data= myHandler.getParseData();   
  14.   Intent intent=newIntent();   
  15.   intent.putExtra("data",data);   
  16.   intent.setClass(RSSreader.this, ShowHoroscopes.class);   
  17.   startActivity(intent);   
  18.   }   
  19.   catch (Exception e) {   
  20.   // TODO: handle exception   
  21.   e.printStackTrace();   
  22.   }   
  23.   finally  
  24.   {   
  25.   mydialog.dismiss();   
  26.   }   
  27.   
  28.   }   
  29.   }.start();   
  30.   }  

效果如图:

OPhone应用程序内容在线更新的新思路

 总结
  虽然这种方法并不能适用于大多数应用软件的内容更新,但是对于我们这些学生开发者来说,如果想要实现一个关于内容方面的应用软件,在没有服务端的情况下,我想我们可以尝试着找到相关的RSS资源,然后借鉴这种方法达到我们想要的期望。

相关推荐

IT前沿 / 0评论 2019-12-29
JamesChen / 0评论 2010-09-20
liyu / 0评论 2011-11-12
月月鸟个人 / 0评论 2012-07-03