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を使用するアクティビティが破棄された後、またはアプリケーション全体が句であると想定された場合に、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」は静的変数であるため、アプリケーションを閉じてもnullにはなりません。アプリケーションを閉じることは、アプリケーションが破壊されたことを意味するものではありません。

また、Androidアプリを閉じるという概念はありません。アプリを終了しても、同時に破壊されることはありません。Android OSは、アプリが使用されなくなったときにアプリを閉じるときに内部で処理します。Androidがアプリを破棄することを決定したときにメモリが不足した場合、この静的変数もnullになります。

于 2012-05-25T21:37:44.900 に答える
2

Javaオブジェクトがいつガベージコレクションされるかを正確に制御することはできません。オブジェクトへの(非循環)参照がなくなると、オブジェクトはガベージコレクションの対象になります。さらに、Androidでは、アクティビティがメモリから削除されるタイミングを制御できません。

于 2012-05-25T21:29:10.990 に答える
0

なぜそれが起こっているのですか?

私は何が欠けていますか?

Androidのガベージコレクションの静的メンバーがアプリケーションに属する場合はどうなりますか?

まず、他の人が言ったように、Android OSはアプリケーションプロセスのライフサイクルを独自に管理するため、Androidには密接なアプリケーションの概念はありません。

次に、間違ったテストを行いました-すべてのアプリを閉じる代わりに反対のことを行う場合-つまり-より多くのアプリを起動してメモリをいっぱいにすると、最終的にアプリケーションのメモリがクリーンアップされて他のアプリケーションで使用されるようになりますすべての静的メンバーとインスタンスメンバーが含まれます!次に、静的変数が期待どおりにNULLになることがわかります。

それらは単に「怠惰に」メモリをクリーンアップします。十分なメモリがある場合、アプリケーションは決してクリーンアップされない可能性があります。

実際、私が知る限り、それを回避する方法はありません。デバイスのメモリからどの時点でもオブジェクトがクリーンアップされないことを認める方法はありません。場合によっては、それは悪い行動につながります。シングルトンが作成時に大量の処理を行う場合など、getInstanceを呼び出すと、UIがスタックしたり、無責任のためにアプリがクラッシュしたりする可能性があります。

于 2014-04-28T17:18:53.353 に答える