2

我对 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;
    }

    ...
    ...

我的问题是:如果实例被分配一次,在系统对类创建者的初始调用期间,该实例永远不应为空!所以if (instance == null)insidegetInstance()永远不会返回 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();正确吗?我的问题仍然存在...

4

3 回答 3

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);

    }
}
于 2012-11-21T19:33:19.540 回答
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()总会给你一个参考。

于 2012-11-21T19:16:58.480 回答
0

你错过了一件非常重要的事情来让它正常工作。

instance = new MyApplication();

如果没有这一行,则 theninstance将始终为 null,并且您将返回 null。否则,调用 new 时会创建实例MyApplication();

于 2012-11-21T19:14:46.550 回答