2

Android でのガベージ コレクションに関して、予期していなかった動作が見られます。

App という名前のアプリケーションを拡張し、マニフェストを変更したクラスがあります。

<アプリケーション android:name=".App" ...

私はこれを以前に使用して、便宜上静的メソッドを介してアプリケーションコンテキストを取得できるようにしましたが、アプリケーション全体がガベージコレクションされたときにのみガベージコレクションする必要がある、小さくても重要な情報を保存することもできます。この情報は、初期化されたシングルトン オブジェクトに格納され、アプリケーション クラスに参照が格納されます。

public class App extends Application {

Context mContext;
Info info;

@Override
public void onCreate() {
    super.onCreate();
    mContext = this;

    info = Info.getInstance();

    this.setTheme(R.style.MyTheme);
}

public static Context getContext(){
    return mContext;
}
}

Info が初期化されると、単純なメンバー オブジェクトも初期化されます。

public class Info {


    public Profile profile;

    (...)

    private Info() {
       profile = new Profile();
    }

    (...)
 }

私が経験した問題は、アプリが一時停止され、メモリを集中的に使用する別のアプリを実行すると (ガベージ コレクションを強制するため)、アプリに戻ると、プロファイル var にアクセスしようとすると NullPointerException が発生することです。

Info.getInstance().profile

アプリケーションが「Info」シングルトンへの参照を保持しているという事実と、シングルトンが「プロファイル」への参照を保持しているという事実は、ガベージコレクションを取得しないようにするべきではありませんか?

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

0

Android のアプリケーション ライフサイクルについて詳しく学びましょう。メモリを必要とする別のアプリを起動すると、他のアプリケーションはバックグラウンドで強制終了されます。

次に、OnCreate をもう一度実行する必要があるため、Info が最初からもう一度作成されるため、ガベージ コレクターにすることはできません。

アクティビティのライフサイクル

于 2013-01-31T19:02:34.187 に答える
-1

シングルトンは、1 つのオブジェクトのみがインスタンス化されることを意味します。ガベージ コレクションとシングルトンの関係はありません。シングルトンの理解を深めるために、このリンクを参照してください。

データをローカルに保存する方法については、この回答を参照してください。アプリにデータを保存する方法は?

于 2013-01-31T18:44:05.800 に答える