2010-09-08 57 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; 
} 
}