10

最近我开始用Java for Android 进行开发。

我的想法是创建一个静态类,它将在开始时加载大量内容并在应用程序的整个生命周期中存储结果。

我一直在阅读很多如何在活动之间共享对象的内容,我认为最好的方法是创建一个静态类。你怎么看?我应该使用另一种方法吗?我问是因为我在互联网上阅读了很多反对意见。

谢谢你。

4

3 回答 3

19

我假设您指的是一个类的静态字段,而不是静态类,正如 Wyzard 指出的那样,它是完全不同的东西。作为一般经验法则,在 Java 中将信息保存在静态字段中并不是一个好主意。这样做的原因是它阻止了实例化您存储在类中的任何内容的多个实例的能力。

在 Android 应用程序的特定情况下,处理与应用程序本身关联的数据存储问题的最佳方法是子类化android.app.Application该类并使用它来处理应用程序全局数据:

class FooApplication extends Application
{
    private String privData;

    public String getPrivData() {
        return privData;
    }
}

然后你需要声明这个类是你的主应用程序类(而不是默认的Application)。在application条目中AndroidManifest.xml添加以下内容:

<application android:name="com.example.application.FooApplication"
             ...>
    ...
</application>

Context.getApplicationContext()然后,您可以使用将成为子类实例的方法从应用程序内部的任何位置查找应用程序实例Application

FooApplication app = (FooApplication)Context.getApplicationContext();
String privData = app.getPrivData();

根据您尝试查找“Application”子类的位置,您可能必须在没有“Context”的情况下调用“getApplicationContext()”:

FooApplication app = (FooApplication)getApplicationContext();
String privData = app.getPrivData();
于 2013-02-26T07:34:47.860 回答
3

您的解决方案的问题在于,您基本上是在创建大量全局变量。有时这是不可避免的,但它具有全局变量总是存在的相同类型的问题——你很快就会得到难以阅读的代码,而这些代码实际上并没有很好的 OO 分解。您可以使用它,但要谨慎使用它——仅用于真正将在许多活动之间共享的重要数据结构。

于 2013-02-26T07:33:19.480 回答
2

Android 提供了一个名为 的类Application,只要您的应用程序没有被杀死,它就不会被 gc'ed。使用这个类进行初始化,静态类作为容器有点难看,但我无法确定为什么会这样。

我只将它们用作常量的容器,例如不能表示为 EnumSets 的位掩码。

正如其他帖子提到的那样SharedPreferences:我认为存在偏好是为了存储值,而不是为了加载应用程序所需的结构。这些结构应该从表示或构成数据语义模型的构造中加载。

于 2013-02-26T07:31:11.503 回答