【问题标题】:Android Application life cycle and singeltonAndroid 应用程序生命周期和单例
【发布时间】:2012-06-01 10:53:17
【问题描述】:

我们大多数人都熟悉这种模式:

   public class MySingeltone {

    public String mSomeReferenceTypeData;
    public int mSomeValueTypeData;

    private static MySingeltone mInstance;

    private MySingeltone() {

    }

    public static MySingeltone getInstance() {
        if (mInstance == null) {
            mInstance = new MySingeltone();
        }

        return mInstance;
    }
 }

我的问题是我最近发现 mInstance 在使用他的活动被销毁后不等于 null,或者当整个应用程序假设为子句时,例如:

public class SomeActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        MySingeltone mySingeltone = MySingeltone.getInstance();
        mySingeltone.mSomeReferenceTypeData = "some value";
    }
}

在关闭所有运行活动的应用程序后(比如 10 秒后)下一次启动“SomeActivity”时,mInstance 仍然持有相同的引用,其字段中的值也相同。

为什么会这样?

我错过了什么?

什么时候android垃圾收集静态成员属于应用程序?

【问题讨论】:

  • 你在哪里检查单例是否是同一个实例?
  • @Jazzy Josh:您可以通过在设置新值之前获取值来简单地看到它。在我的示例中,它将位于 getInstance 方法和下一行之间。只需要检查它不等于null,因为第一次启动该值仍然是null..
  • 我特别指的是应用程序中的位置。如果您的 Activity 从未被杀死,那么您将从 onStop 转到 onRestart 和 onStart 而不是通过 onDestroy 并被杀死,并且您的 Singleton 仍然活着。
  • @Jazzy Josh:我肯定会通过 onDestroy()。然后我再次打开应用程序
  • 这是应该的。所以它是静态单例。但是我遇到了相反的情况:当引用持有活动被破坏时,单身人士也消失了!为什么?

标签: android singleton static-members application-lifecycle


【解决方案1】:

由于“mInstance”是一个静态变量,当您关闭应用程序时它不会为空。关闭应用程序并不意味着您的应用程序被销毁了。

也没有关闭您的 Android 应用程序的概念。如果您退出您的应用程序,它不会同时被破坏。当不再使用时关闭应用程序时,Android OS 会在内部处理它。如果 android 决定销毁应用程序时内存不足,那么这个静态变量也将变为 null。

【讨论】:

  • 这个答案是错误的,如果内存已满并且 android os 决定撤出他的应用程序,那么下次他尝试使用它时这个变量也会为空。
【解决方案2】:

为什么会这样?

我错过了什么?

android 垃圾回收静态成员什么时候属于应用程序?

首先,正如其他人所说,Android 上没有封闭的应用程序概念,因为 android 操作系统会自行管理应用程序进程的生命周期。

其次,您进行了错误的测试 - 如果不关闭所有应用程序而是执行相反的操作 - 即通过启动越来越多的应用程序来填充内存,那么最终您的应用程序的内存将被清理以供其他应用程序使用应用程序,这包括所有静态成员以及实例成员!然后,您将看到静态变量将如您预期的那样为 NULL。

他们只是“懒惰地”清理内存,如果有足够的内存,那么您的应用程序可能永远不会被清理。

实际上,没有办法解决它,据我所知,没有办法保证在任何时候都不会从设备内存中清除对象。在某些情况下,它会导致不良行为。比如如果单例对它的创建做了繁重的处理,调用 getInstance 可能会让你的 UI 卡住,甚至因为不负责任而导致你的应用程序崩溃。

【讨论】:

    【解决方案3】:

    您无法控制 Java 对象何时被垃圾回收。当一个对象不再有(非循环)引用时,它就有资格进行垃圾回收。 此外,在 Android 中,您无法控制 Activity 何时从内存中删除。

    【讨论】:

    • 这是否意味着如果我希望我的单格顿类在某些活动创建时为空 - 我需要在 onDestroy() 方法或类似的方法中将其设置为空?跨度>
    • @Tan Kanel 是的。但奇怪的是你想销毁一个单例,因为单例应该代表始终存在的东西。也许你的单例中可能有一些 open()/close()/isOpened() 方法,或者它应该是一个服务。
    • 是的,你说得对,这就是我正在做的事情,但我更多地询问了它的原则..
    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多