在 android 中,是否推荐使用静态变量?例如,在 Java 中实现单例模式,我通常会这样做:
private static A the_instance;
public static A getInstance() {
if (the_instance == null) {
the_instance = new A();
}
return the_instance;
}
另外,Android JVM 什么时候会清理它?
static
字段Class
作为一个整体附加到实例上,而实例又附加到ClassLoader
加载了类的实例上。the_instance
当整个ClassLoader
被回收时将被卸载。我有 90% 的把握当 Android 破坏应用程序时会发生这种情况(而不是当它进入后台或暂停时,而是完全关闭时。)
因此,只要您的应用程序运行,就可以将其视为生命。辛格尔顿是个好主意吗?人们有不同的看法。我自己认为适当使用时很好。我认为答案在 Android 上变化不大。内存使用本身不是问题;如果您需要在内存中加载一堆东西,无论您是否将数据封装在 Singleton 中,这要么是个问题,要么不是问题。
我认为静态变量是可以的。
这就是 Android 文档所说的:
http://developer.android.com/guide/appendix/faq/framework.html
如何在单个应用程序中的活动/服务之间传递数据?
公共静态字段/方法
使数据可跨活动/服务访问的另一种方法是使用公共静态字段和/或方法。您可以从应用程序中的任何其他类访问这些静态字段。要共享一个对象,创建对象的活动会设置一个静态字段以指向该对象,任何其他想要使用该对象的活动只需访问该静态字段。
与其他人所说的相反 - 这还不错。当然,它有一些结构。在官方 googlesamples/android-architecture 存储库中,它在 todo-mvp-clean 下使用(Todo 应用程序实现 MVP 模式并遵循清洁架构原则)。看看这个文件。
您可以看到很多引用单例 getter 的静态方法。
现代、不易出错且方便的替代方案是 Dagger DI 框架。
我不确定这种方法是否适用于您可用内存有限的移动平台。更不用说该应用程序将在支持多任务的设备上运行。
我认为,这种方法可能会占用设备的内存,但我没有文件支持这一点。也许比我受过更多教育的人可以分享他们的想法。
不,不要这样做!辛格尔顿是一个反模式!. 相反,使用依赖注入,无论是通过框架(例如通过Dagger或Roboguice)还是通过显式传递实例化对象。