57

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

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

另外,Android JVM 什么时候会清理它?

4

5 回答 5

65

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

因此,只要您的应用程序运行,就可以将其视为生命。辛格尔顿是个好主意吗?人们有不同的看法。我自己认为适当使用时很好。我认为答案在 Android 上变化不大。内存使用本身不是问题;如果您需要在内存中加载一堆东西,无论您是否将数据封装在 Singleton 中,这要么是个问题,要么不是问题。

于 2010-03-19T09:30:47.757 回答
15

我认为静态变量是可以的。

这就是 Android 文档所说的:

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

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

公共静态字段/方法

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

于 2010-09-03T20:00:28.143 回答
1

与其他人所说的相反 - 这还不错。当然,它有一些结构。在官方 googlesamples/android-architecture 存储库中,它在 todo-mvp-clean 下使用(Todo 应用程序实现 MVP 模式并遵循清洁架构原则)。看看这个文件

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

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

于 2019-03-23T01:31:17.560 回答
0

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

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

于 2010-03-19T09:26:31.053 回答
-6

不,不要这样做!辛格尔顿是一个反模式!. 相反,使用依赖注入,无论是通过框架(例如通过DaggerRoboguice)还是通过显式传递实例化对象。

于 2010-03-19T09:31:05.240 回答