2012-07-19 16 views
35

私はいくつかのSharedPreferencesを使用してアプリケーションにデータを格納しています。 いくつかの設定は、多くのアクティビティで使用されます。SharedPreferencesアプリケーションコンテキストとアクティビティコンテキスト

私は、SharedPreferencesが内部的に高速な読み取りアクセスのためのマップに裏打ちされ、設定が変更されたときにsdcardに書き込まれることを知っています。

私はsharedpreferenceがactiviesの多くによってアクセスされた場合に優れている方法だろう:

  1. はアクティビティコンテキストを使用して、すべての活動でそれをインスタンス化します。
  2. すべてのアクティビティでインスタンス化しますが、アプリケーションコンテキストを使用します。
  3. Applicationクラスを作成し、そのインスタンスを一度だけインスタンス化します。これはシングルトンに似ています。

私が使用しているのは、1.ソリューションには、すべてのアクティビティに対してsharedpreferenceオブジェクトがありますか?そして、活動が破壊されたときにsharedpreferenceの内部マップは破壊されますか?

私が2.ソリューションを使用する場合、すべてのアクティビティでgetSharedPreferencesを呼び出しますが、インスタンスは1つだけですか?そしてアプリケーションが生存している限り、内部マップは記憶されますか?

うまくいえば、Androidが内部的にどのように処理するかを誰かが知っていたらうれしいことです。

+0

私はchoice threeをお勧めします。あなたはあなたのすべての活動からアクセスすることができ、1つだけ読む必要があります。 – Joel

答えて

55

Contextインスタンスは(それがActivity又はApplicationインスタンスである)同じ静的マップHashMap<String, SharedPreferencesImpl>を共有することを示すことsourcesを検討する価値があります。あなたはContext.getSharedPreferences(name, mode)を経由して、同じ名前でSharedPreferencesのインスタンスを要求する場合、必ずマップがすでに(渡された名前である)キーをSharedPreferencesインスタンスが含まれている場合

だから、あなたはそれを最初にチェックするので、同じインスタンスを取得します。 SharedPreferencesインスタンスがロードされると、再度読み込まれることはなく、代わりにマップから取得されます。

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

+0

+1私もそう信じていた..批准してくれてありがとう – Rasmus

7

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

このようにすると、インスタンスを1回作成して読みやすく、再利用することができます。

+0

また、アプリケーションがHTTPリクエストから返ってきたときにも有効です。この場合、コンテキスト(アクティビティ)が存在しない可能性があるため、context.getSharedPreferencesはNPEにつながります。シングルトンを使用する場合、これは起こりません。 – CoolMind

11

SharedPreferencesは、シングルトンとしてAndroidによって内部的に管理されます。

context.getSharedPreferences(name, mode); 

は、限り、あなたは同じ 名前を使用すると、あなたは常に同じ インスタンスを得るでしょう:あなたが使用して好きなだけのインスタンスを取得することができます。したがって、並行性の問題はありません。

関連する問題