我将单例方法用于Application的子类。我使用以下内容:
public class MyApplication extends Application {
private static MyApplication instance;
public MyApplication() {
instance = this;
}
public static MyApplication getInstance() {
if (instance == null) {
synchronized (MyApplication.class) {
if (instance == null)
new MyApplication();
}
}
return instance;
}
...
...
我的问题是:如果实例被分配一次,在系统初始调用类创建者的过程中,实例应该永远不会为null!因此if (instance == null)
内的getInstance()
永远不会返回true。还是我错了?
修改
我更正了维基百科上的代码:
public class volatile MyApplication extends Application {
private static MyApplication instance;
public MyApplication() {
}
public static MyApplication getInstance() {
if (instance == null) {
synchronized (MyApplication.class) {
if (instance == null)
instance = new MyApplication();
}
}
return instance;
}
...
...
已添加volatile
和instance = new MyApplication();
这是正确的吗?我的问题仍然存在......
答案 0 :(得分:0)
你错过了一个非常重要的事情,让它正常工作。
instance = new MyApplication();
如果没有这一行,那么instance
将始终为null,并且您将返回null。否则,当您调用新的MyApplication();
答案 1 :(得分:0)
如果您退出应用程序或Android将其取消,它将只为null,在这种情况下,您无法检查它;)
您永远不应该创建应用程序类的实例,因此不应该new MyApplication()
。您可以将Application扩展到其他类中,然后实例化那些但是您正陷入风险区域,您应该质疑您的方法。
请参阅应用程序生命周期文档:
http://developer.android.com/reference/android/app/Application.html
总之,instance=this
适用于其他类使用((MyApplication)this.getApplication()).instance;
那就是说,你应该去Herr K的个人资料并为他提供一个答案,因为他的评论是正确的解决方案,而不仅仅是我的问题的答案。
关键是,你不需要任何实例的东西。 (MyApplication)this.getApplication()
将始终为您提供参考。
答案 2 :(得分:0)
我将此代码用于我的Singleton类。试试这个。
公共类MenuPage扩展了Activity {
private static MenuPage m_instance = null;
/**
* Get the singleton instance of this class
*
* @return MenuPage
*/
public static MenuPage getInstance() {
if (m_instance == null) {
m_instance = new MenuPage();
}
return m_instance;
}
/**
* Constructor, default
*/
public MenuPage() {
m_instance = this;
}
/**
* Called when the activity is first created.
*/
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main);
}
}