在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何时清理它?
谢谢。
答案 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)还是通过显式传递实例化对象。