从课程中访问Application类,然后访问Activity

时间:2010-09-08 09:37:24

标签: java android

在我的应用程序中,我需要可以访问一些活动的数据。我已经读过一个很好的解决方案就是使用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

如何访问我的变量?

2 个答案:

答案 0 :(得分:4)

通常,XML解析器类应该独立于任何特殊上下文。这意味着开发人员应该能够使用它,无论他是在开发应用程序,服务或库还是其他人。

XML解析器类不应该对它所使用的上下文以及它从哪里获取参数做出任何假设(只有当它有权访问Application实例时才限制你的解析器才能运行) 。解析器不应该获取其参数,参数应该由调用者设置。

您不希望XML解析器类向用户显示消息,是吗?右:“XML解析器与用户界面有什么关系?”相反,您会抛出异常并确保它们得到正确处理,例如,取决于是否存在用户界面(日志记录)。

所以你要做的就是在构造XML解析器的实例时传递你需要的参数。但是您将您的应用程序实例作为参数传递(再次考虑依赖项),但您从应用程序类传递必要的参数。

在上面的示例中:

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

你应该确保将“工具内容”与任何阻止你普遍使用它的东西分开。如果您想在另一个项目中使用XML Parser类,而您的参数不是由应用程序上下文提供,而是在其他类中提供,会发生什么?

我确信你可以进行为期一周的关于面向对象设计以及应该如何做的讨论 - 但这基本上就是我要做的......

答案 1 :(得分:0)

Thorsten是对的,但如果您仍然决定使用您的应用程序,则可以使用Singleton。

public class MyApplication extends Application {

private static MyApplication instance;

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