【问题标题】:How to destroy static field when app exits?应用程序退出时如何销毁静态字段?
【发布时间】:2013-04-14 03:22:14
【问题描述】:

我的应用程序中有一个singleton 类,它的定义有点像:

public class SingletonTest {
    private SingletonTest() {}

    private static SingletonTest instance = new SingletonTest();

    public static SingletonTest getInstance() {
        return instance;
    }
}

当我退出我的应用程序并再次打开时,instance 没有再次初始化,因为前一个没有被破坏并且仍在 JVM 中。但我想要的是每次进入我的应用程序时初始化静态字段。那么,我应该在onDestroy() 方法中做什么呢?非常感谢!

【问题讨论】:

  • 创建SinggletonTest.init() 并从应用程序Activity onStart() 或类似的覆盖方法中调用它。
  • 非常不鼓励单身人士。如果你想在你的应用程序中使用一个类的单个实例,我推荐依赖注入,并且当你绑定你的类时告诉它作为单例绑定。这摆脱了静态引用,并为您提供所需的行为。
  • @ChristopherPerry 虽然我不是过度使用单身人士的忠实拥护者,但要说他们非常不鼓励这样做有点牵强。 Android 团队中至少一位知名开发人员建议使用它们:stackoverflow.com/questions/3826905/…
  • @kabuko,我不同意 Dianne Hackborn,与您链接中的答案相同,原因也相同。
  • @ChristopherPerry 感谢您的建议!你能推荐一个适合android 项目并且流行的dependency injection 框架吗?

标签: android static garbage-collection singleton destroy


【解决方案1】:

只要您的应用程序保留在内存中,您的静态变量就会保留在内存中。 这意味着,静态变量将与您的应用程序一起自动销毁。

如果您想要一个新的单例实例,您需要创建一个静态方法来重新初始化您的单例,并在应用程序对象的 onStart 或您启动的第一个活动中调用它(或在需要时调用)

private Singleton() {}
private static Singleton mInstance;

//use this method when you want the reference
public static Singleton getInstance() {
    //initializing your singleton if it is null
    //is a good thing to do in getInstance because
    //now you can see if your singleton is actually being reinitialized.
    //e.g. after the application startup. Makes debugging it a bit easier. 
    if(mInstance == null) mInstance = new Singleton();

    return mInstance;
}

//and this one if you want a new instance
public static Singleton init() {
    mInstance = new Singleton();
    return mInstance;
}

应该这样做。

【讨论】:

  • 如您所说:一个静态变量将与您的应用程序一起自动销毁。既然我的应用程序已被销毁,为什么静态字段没有销毁?为什么singleton class 不能与我的应用程序销毁一起卸载?谢谢。
  • 如果您的应用程序从内存中完全删除,它还​​应该从内存中删除静态变量。您确定您的应用程序已完全销毁吗?例如,您是否在应用程序设置中强制关闭它,然后在单例中使用断点重新打开它以查看它是否为空并重新初始化?另外,您如何定义它是同一个实例还是一个新实例?因为你将实例化留给类加载器,所以当你第一次调用你的单例时,它几乎总是会被实例化。在 getInstance() 中查看我的 cmets
【解决方案2】:

从您所说的来看,Singleton 似乎不适合您想做的事情。您应该声明一个实例变量,该变量将由 onCreate()/onStart() 和 onStop()/onDestroy() 方法初始化/清除。

有关 Activity 生命周期,请参阅 this graph。

来源:http://developer.android.com/reference/android/app/Activity.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 2019-05-02
    • 2012-09-11
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多