2011-04-18 34 views
1

我正在研究一個android應用程序,我將使用SAX相當多。我想知道將我的處理程序的「數據」或結果發送回我的活動的最佳方式是什麼?Android:將數據從DefaultHandler類傳遞給Activity?

IMO在我的處理程序中調用intent或創建敬酒等是一種混亂,我會優先根據我的處理程序中發生的事情從我的活動中完成那些類型的事情。

你們認爲什麼?我應該如何以一種乾淨的方式來做到這一點?

下面是一個代碼示例:

 public void startElement(String n, String l, String q, Attributes a) throws SAXException{ 
      if(l == "login") in_loginTag = true; 

      if(l == "error") { 

        if(Integer.parseInt(a.getValue("value")) == 1) 
         Toast.makeText(getApplicationContext(), "Couldn't connect to Database", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 2) 
         Toast.makeText(getApplicationContext(), "Error in Database: Table missing", Toast.LENGTH_SHORT).show(); 
        if(Integer.parseInt(a.getValue("value")) == 3) 
         Toast.makeText(getApplicationContext(), "Invalid username and/or password", Toast.LENGTH_SHORT).show(); 

       error_occured = true; 

      } 

我prefere沒有顯示從我的處理程序類,這些敬酒。

回答

2

我在當前的應用程序中完成了相當多的XML解析,這對this example有很大的幫助。

設計明智的我相信,而不是敬酒或意圖廣播等你應該使用自定義的SAX處理程序,它將在開始的XML元素實例化一個Parse對象。這個對象是你的XML項目的表示。所以也許這個物體是Car,並且有門,彩色,輪子的setter/getter。在解析SAX解析器中的數據時,您將設置這些值。當SAX解析器完成解析時,您可以調用解析器使其將對象傳遞迴您的活動,該活動與XML中的所有汽車完全一致。在我的情況下,我實際上填充了傳回的對象的列表/數組。該示例僅處理一組數據。無論如何,鏈接解釋了這一切。

編輯:只是看着我的代碼,實際上我在處理程序中做的是構建ParsedData集對象的數組,這些對象在通過getParsedData()分析完成後傳回給活動。下面是一些重要的代碼:

XML處理程序:

private boolean in_IdSite; 
private boolean in_SiteName; 

private ArrayList<ParsedChannelDataSet> list = new ArrayList<ParsedChannelDataSet>(); 

public ArrayList<ParsedChannelDataSet> getParsedData() { 
    return this.list; 
} 

@Override 
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { 
    // first tag parsed so add a new ParsedEventDataSet object 
    if(localName.equals("stmSiteUser")) { 
     list.add(new ParsedChannelDataSet()); 
    } else if (localName.equals("idSite")) { 
     this.in_IdSite = true; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = true;  
    } 
} 

@Override 
public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 
    if (localName.equals("idSite")) { 
     this.in_IdSite = false; 
    } else if (localName.equals("siteName")) { 
     this.in_SiteName = false; 
    } 
} 

@Override 
public void characters(char ch[], int start, int length) { 
    // determine if any tag is current, get data from tag and populate into ParsedEventDataSet 
    if (this.in_IdSite) { 
     this.list.get(this.list.size()-1).setExtractedIdSite(new String(ch, start, length)); 
    } else if (this.in_SiteName) { 
     this.list.get(this.list.size()-1).setExtractedSiteName(new String(ch, start, length)); 
    } 
} 

這裏是我的樣品ParsedDataSampleSet(這可以稱爲任何你想要的),很明顯,你想要的東西來代替網站名稱和idSite別的了。這些只是我的XML元素

public class ParsedChannelDataSet { 
    private String extractedIdSite = null; 
    private String extractedSiteName = null; 


    public String getExtractedIdSite() { 
     return extractedIdSite; 
    } 

    public void setExtractedIdSite(String _extractedIdSite) { 
     this.extractedIdSite = _extractedIdSite; 
    } 

    public String getExtractedSiteName() { 
     return extractedSiteName; 
    } 

    public void setExtractedSiteName(String _extractedSiteName) { 
     Log.d("", _extractedSiteName); 
     this.extractedSiteName = _extractedSiteName; 
    }  


    public String toString() { 
     /* TODO */ 
     return "todo"; 
    } 
} 

所以你可以看到我建立了一個傳回給活動的ParsedChannelDataSet對象的數組。這是一個比使用吐司或廣播更好的解決方案,因爲它有更多的解耦解決方案

編輯2:我在鏈接的第二頁上的第一篇文章提到了解析多個XML元素,比如我的。見這裏(parse multiple xml elements)。

我希望這可以幫助你

+0

我以前見過這個例子,但只是簡單地看了一下。我可能會採用這種方法。謝謝! – networkprofile 2011-04-18 22:49:18

+0

我剛剛添加了一些示例代碼,我意識到我實際上在處理程序中構建了一個我解析對象的數組,我不認爲這個例子。 – wired00 2011-04-18 23:13:47

+0

究竟是一個'ParsedChannelDataSet',我在谷歌裏找不到它。另外,這裏包含了什麼? 'list.add(new ParsedChannelDataSet());'或者你只計算你的'stmSiteUser'什麼的? – networkprofile 2011-04-18 23:43:38

1

,你可以:

  1. 傳遞活動進入XML 處理程序,將其存儲爲一個實例變量 ,並呼籲回到它需要 。

  2. 在您的活動中創建一個靜態成員,並在創建時將其分配給 。然後從您的XML處理程序中,您可以引用ActivityClass.getMyActivity()[例如]並調用某種方法來彈出Toast。

iOS/Mac OS X有一個叫做「通知」的概念,任何代碼都可以註冊某個事件的興趣。如果有一個Android的等價物,那是另一種方法來做到這一點,我。即XML處理程序可以廣播某種失敗事件/通知,並且活動可以監聽它並彈出Toast。

+0

從我所瞭解的iOS式的通知使用你如何描述將是Android的廣播與意向在活動註冊的接收器? – wired00 2011-04-18 21:46:28

+0

看起來像。不幸的是,你需要訪問Context才能發送廣播事件,我相信這需要一些類似於我的解決方案的工作,以使XML Handler可以使用Context。 – mharper 2011-04-18 22:15:57

0

我會使用我在我的活動中創建的自定義Handler並將它傳遞給XML解析器。然後在這個解析器中,我可以在自定義Handler上調用一些sendMessage

Handler here的示例用法。

相關問題