4

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

   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垃圾收集静态成员属于应用程序时?

4

3 回答 3

5

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

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

于 2012-05-25T21:37:44.900 回答
2

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

于 2012-05-25T21:29:10.990 回答
0

为什么会这样?

我错过了什么?

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

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

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

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

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

于 2014-04-28T17:18:53.353 回答