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

    ...
    ...

私の質問は次のとおりです。インスタンスが一度割り当てられた場合、システムによるクラス作成者への最初の呼び出し中に、インスタンスが後で null になることはありません! そのため、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;
    }

    ...
    ...

追加されvolatileinstance = new MyApplication();それは正しいですか? 私の疑問はまだ残っています...

4

3 に答える 3

0

このコードをシングルトンクラスに使用します。これを試して。

パブリッククラス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

これを正しく機能させるための非常に重要なことが1つ欠けています。

instance = new MyApplication();

この行がないinstanceと、常にnullになり、nullを返します。それ以外の場合は、newを呼び出すときにインスタンスが作成されますMyApplication();

于 2012-11-21T19:14:46.550 に答える
0

アプリを終了するか、Android がそれを強制終了した場合にのみ null になります。その場合、チェックすることはできません ;)

アプリケーション クラスのインスタンスを作成しないでくださいnew MyApplication()。Application を他のクラスで拡張し、それらをインスタンス化することもできますが、危険な領域に陥っているため、アプローチに疑問を抱く必要があります。

アプリケーション ライフ サイクルのドキュメントを参照してください。

http://developer.android.com/reference/android/app/Application.html

要約すると、instance=this他のクラスが使用しても問題ありません((MyApplication)this.getApplication()).instance;

そうは言っても、あなたはKさんのプロフィールに行き、彼の答えに賛成票を投じるべきです。彼のコメントは、あなたの質問に対する単なる答えではなく、正しい解決策だからです。

ポイントは、そのインスタンスのものは必要ないということです。 (MyApplication)this.getApplication()いつも参考になります。

于 2012-11-21T19:16:58.480 に答える