Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中使用静态变量_Java_Android_Dalvik - Fatal编程技术网

Java 在Android中使用静态变量

Java 在Android中使用静态变量,java,android,dalvik,Java,Android,Dalvik,在android中,使用静态变量是推荐的做法吗? 例如,在Java中实现单例模式,我通常会: private static A the_instance; public static A getInstance() { if (the_instance == null) { the_instance = new A(); } return the_instance; } 另外,Android JVM什么时候会清理这个问题 谢谢。我不确定这种方法是否适用于内

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

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}
另外,Android JVM什么时候会清理这个问题


谢谢。

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


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

静态
字段作为一个整体附加到
实例,该实例又附加到加载该类的
类加载器
当回收整个
类加载器
时,将卸载\u实例。我90%确信当Android破坏应用程序时会发生这种情况(不是当它进入后台或暂停,而是完全关闭时)


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

不,不要这样做。相反,使用依赖项注入,无论是通过框架(如via或)还是通过显式传递实例化对象。

我认为静态变量是可以的

这是Android doc所说的:

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

公共静态字段/方法


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

与其他人所说的相反-这非常正常。当然,它有一定的结构。在官方的googlesamples/android架构回购协议中,它是在todo mvp clean(实现mvp模式并遵循clean架构原则的todo应用程序)下使用的。 看看这个

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



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

请记住,Android核心团队提倡使用“反模式”,Google Guice似乎需要大约800KB的JAR,这对移动应用程序来说是不好的。Guice很棒,但对许多应用程序来说可能是杀伤力过大。但是,如果您要深入研究Guice,请看看这个优秀的项目:依赖注入带来了复杂性。我看到一些开发人员花费数小时来找出注入错误对象的原因。单身有它的价值@yonexbat框架确实带来了复杂性,但也可以执行显式注入(没有框架),这是可以理解的。然而,两者都比使用单例更好,因为单例使代码不灵活且难以测试。请参阅我的链接,以了解为什么singleton是一种反模式并且应该避免。您在这里对singleton模式的看法做出了一个脆弱的假设,即使用私有构造函数会导致单个实例。事实并非如此。在静态对象实例创建方法的实现中,单个实例是策略而不是语言强制的,例如:“getInstance”。您可以让此方法返回任意多个实例,也可以返回一个实例,具体取决于您对类的期望。如果确认,将保留此方法,直到您的整个过程被销毁。当你的进程恢复时,你的单身汉将重新出现!应该注意的是,将重新创建singleton,但不会自动恢复singleton的原始状态。这必须手动完成。@harshjv单例通常也被设计为不可变的,在这种情况下,无论您看到它的旧副本还是新副本都无关紧要。但是如果您的单例保持状态,则当单例被销毁时,该状态将丢失。它会被重新创建,但具有默认的初始状态。@harshjv,Sean Owen是正确的。当进程被销毁时,单例被销毁。当进程恢复时,将自动重新创建单例。但是,不会自动恢复singleton的任何属性或底层私有成员变量。您必须分别保存和恢复对象的状态。如果您的代码将单例初始化为具有类似字符串列表的状态,那么它在每次创建时当然都具有该状态。如果您的代码以某种方式更改了该状态,如添加到列表中,则不会重新创建这些状态。这与JVM中的所有其他对象都是一样的。我认为这实际上可能不是一个问题,因为DVM可以很好地管理它的内存。绑定、回调/侦听器,但不是静态的。您听说过意图吗?静态场是不好的做法,它往往紧密耦合…你们能为我提供合适的解决方案吗?对于静态变量,当应用程序来自后台或打开数小时时,我面临一个问题,它会崩溃。有目的地传递对象是非常困难的。那么什么才是正确的方法呢?@SagarPanwala尝试使用包裹。如果你的大型位图对你的内存产生了巨大影响,试着为它使用一个合适的库,比如毕加索。@SagarPanwala你能提供关于崩溃的更多细节吗?我相信你需要一个锁来同步你的singleton类,否则,在多线程场景下,堆内存中会有多个对象。