2010-09-08 85 views
1

在我的應用程序中,我需要可供幾個活動訪問的數據。我讀過一個很好的解決方案,就是使用Application這個類。所以我用這樣的:從其他類訪問應用程序類活動

public class MyApplication extends Application { 

    private String str; 

    public String getStr(){ 
    return str; 
    } 
    public void setStr(String s){ 
    str = s; 
    } 
} 

,我可以從活動訪問這個變量是這樣的:

MyApplication appState = ((MyApplication)getApplicationContext()); 
String str = appState.getStr(); 

這沒關係,但我也有XML解析器類:

public class MyXMLHandler extends DefaultHandler { 

如果我嘗試在這裏做同樣的事情

MyApplication app = ((MyApplication)getApplicationContext()); 
    String str = app.getStr(); 

我得到The method getApplicationContext() is undefined for the type MyXMLHandler

我該如何訪問我的變量?

回答

4

好吧,通常一個XML解析器類應該獨立於任何特殊的上下文。這意味着開發人員應該能夠使用它,無論他是在開發應用程序,服務還是庫或任何其他應用程序。

XML解析器類不應該對其正在使用的上下文以及它從哪裏獲取參數做出任何假設(只有在它有權訪問Application實例時,纔會限制解析器的功能)。解析器不應該獲取其參數,參數應該由調用者設置。

你不希望你的XML解析器類向用戶顯示消息,對嗎?右圖:「XML解析器與用戶界面有什麼關係?」相反,您會拋出異常並確保它們得到正確處理,例如,取決於是否有用戶界面(日誌記錄)。

因此,您要做的是在構建XML解析器的實例時傳遞所需的參數。但是你做而不是傳遞你的應用程序實例作爲參數(再次考慮依賴關係),但是你從應用程序類中傳遞了必要的參數。

在你上面的例子:

MyApplication app = ((MyApplication)getApplicationContext()); 
MyXmlHandler handler = new MyXmlHandler(app.getStr()); 

你真的應該請務必保留「工具的東西」獨立於任何會妨礙你四海使用它。如果您想在另一個項目中使用您的XML解析器類,而您的參數不是由應用程序上下文提供的,而是其他一些類,會發生什麼?

我敢肯定,你可以有面向對象設計了爲期一週的討論,事情應該怎麼做 - 但是這基本上我怎麼會做...

+0

好的,謝謝,我認爲你是對的。我不想將任何參數從上下文傳遞給解析器,我只是希望解析器將解析結果寫入Application類,因爲我需要在幾個活動中使用這些結果。我將以另一種方式做到這一點,我將把解析器的結果返回給調用者活動,然後將它們寫入應用程序。這是一個正確的方法嗎?謝謝 – Burjua 2010-09-08 10:51:57

+0

好吧,聽起來不錯:-) – 2010-09-08 10:54:30

+0

好的,謝謝)) – Burjua 2010-09-08 12:51:18

0

和Thorsten是對的,但如果你仍然決定使用你的應用程序,你可以使用Singleton。

public class MyApplication extends Application { 

private static MyApplication instance; 

public static MyApplication getInstance() { 
    if(instance == null){ 
     instance = new MyApplication(); 
    } 
    return instance; 
} 
}