在Android中使用静态变量

时间:2010-03-19 08:51:12

标签: java android dalvik

在android中,使用静态变量是推荐的做法吗? 例如,在Java中实现Singleton模式,我通常会这样做:

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

此外,Android JVM何时清理它?

谢谢。

5 个答案:

答案 0 :(得分:62)

static字段作为一个整体附加到Class实例,而后者又附加到加载该类的ClassLoader。当整个the_instance被回收时,ClassLoader将被卸载。我90%肯定当Android破坏应用程序时会发生这种情况(不是当它进入后台,或暂停,但完全关闭时。)

所以,只要您的应用运行,就可以将其视为生存。 Singleton是个好主意吗?人们有不同的看法。我认为,如果使用得当,我自己也没关系。我认为答案在Android上没有太大变化。内存使用本身不是问题;如果你需要在内存中加载一堆东西,这或者是一个问题,或者不是,不管你是否将数据封装在Singleton中。

答案 1 :(得分:15)

我认为静态变量没问题。

这是Android doc所说的:

http://developer.android.com/guide/appendix/faq/framework.html

如何在单个应用程序中的活动/服务之间传递数据?

公共静态字段/方法

跨活动/服务访问数据的另一种方法是使用公共静态字段和/或方法。您可以从应用程序中的任何其他类访问这些静态字段。要共享对象,创建对象的活动会设置一个静态字段以指向此对象,而任何其他想要使用此对象的活动只会访问此静态字段。

答案 2 :(得分:0)

我不确定这种方法是否适用于您可用内存有限的移动平台。更不用说应用程序将在支持多任务的设备上运行。

我认为,这种方法可能会从设备中占用内存,但我没有文档可以支持这一点。或许比我受过更多教育的人可以分享他们的想法。

答案 3 :(得分:0)

与其他人的说法相反-这样做还可以。当然,它具有某种结构。在正式的googlesamples / android-architecture存储库中,它在todo-mvp-clean(实现MVP模式并遵循Clean Architecture原理的Todo应用程序)下使用。 看看这个file

您会看到很多引用单例getter的静态方法。

Dagger DI框架是现代,不易出错且方便的替代方法。

答案 4 :(得分:-7)

没有。不要这样做! Singleton is an anti-patern!。相反,使用依赖注入,无论是通过框架(例如通过Dagger还是Roboguice)还是通过显式传递实例化对象。