Welcome 微信登录

首页 / 操作系统 / Linux / OPhone应用程序内容在线更新的新思路

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