【发布时间】: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