58

アプリにデータを保存するために、いくつかの SharedPreferences を使用しています。一部の設定は、多くのアクティビティで使用されます。

SharedPreferences は、高速読み取りアクセス用のマップによって内部的にバックアップされ、設定が変更されたときに SD カードに書き込まれることを知っています。

共有設定が多くのアクティビティからアクセスされる場合、どの方法が良いのだろうか。

  1. アクティビティ コンテキストを使用して、すべてのアクティビティでインスタンス化します。
  2. すべてのアクティビティでインスタンス化しますが、アプリケーション コンテキストを使用します。
  3. たとえば Application クラスに入れ、シングルトンと同様に一度だけインスタンス化します。

1.ソリューションを使用する場合、すべてのアクティビティにsharedpreferenceオブジェクトがありますか? また、アクティビティが破棄されると、sharedpreference の内部マップは破棄されますか?

2. ソリューションを使用すると、すべてのアクティビティで getSharedPreferences を呼び出しますが、インスタンスは 1 つだけになりますか? また、アプリケーションが動作している限り、内部マップはメモリ内に保持されますか?

うまくいけば、Androidが内部でどのように処理するかを知っている人がいます。

4

4 に答える 4

83

インスタンス(またはインスタンス)が同じ静的マップを共有していることを示すソースを確認することは価値があります。ContextActivityApplicationHashMap<String, SharedPreferencesImpl>

SharedPreferencesしたがって、を介して同じ名前のインスタンスをリクエストすると、マップにキー(渡された名前)のインスタンスがContext.getSharedPreferences(name, mode)すでに含まれているかどうかが最初にチェックされるため、同じインスタンスが取得されます。SharedPreferencesインスタンスが読み込まれるSharedPreferencesと、再度読み込まれることはありませんが、代わりにマップから取得されます。

したがって、実際にはどちらの方向に進むかは重要ではありません。重要なことは、アプリケーションのさまざまな部分から同じ設定を取得するために同じ名前を使用することです。ただし、設定用に単一の「アクセスポイント」を作成することはプラスになる可能性があります。したがって、でインスタンス化された設定のシングルトンラッパーである可能性がありますApplication.onCreate()

于 2012-07-19T19:20:21.943 に答える
22

SharedPreferencesシングルトンとして Android によって内部的に管理されます。以下を使用して、必要な数のインスタンスを取得できます。

context.getSharedPreferences(name, mode);

同じ名前を使用している限り、常に同じインスタンスが取得されます。したがって、同時実行の問題はありません。

于 2012-07-19T19:05:57.873 に答える
10

私は好みのためにシングルトンクラスを使用することを好み、 アプリケーションコンテキストによって一度設定を初期化します。データを追加、更新、および削除する getter および setter(get/put) メソッドを作成します。

このようにして、インスタンスが一度作成され、読みやすく、再利用可能になります。

于 2012-07-19T18:39:17.987 に答える
0

Preferences シングルトン クラスを作成し、applicationContext を使用して拡張 Application クラスでそのクラスのインスタンスを作成できるため、アプリケーション全体でそのオブジェクトを使用できます。sharedPreferenceManager クラスを作成し、applicationContext を提供して静的オブジェクトを作成します。プロジェクト内のどこからでも静的オブジェクトにアクセスできるようになりました

public class App extends Application {
    public static App myApp;
    public static PreferenceManagerSignlton preferenceManagerSingleton;
    @Override
    public void onCreate() {
        super.onCreate();
        myApp = this;
        preferenceManagerSingleton = new PreferenceManagerSignlton();
        preferenceSingleton.initialize(getApplicationContext());
    }
}

プロジェクト内の静的オブジェクトへのアクセス

App.myapp.PreferenceManagerSignltonz.getSavedValue();

于 2022-01-12T17:06:32.807 に答える