對於大多數像我這樣的小型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資源,然後借鑒這種方法達到我們想要的期望。