2012-02-14 22 views
4

私のアプリがフィードから最新のデータを取得するときにSharedPreferencesに日付を書いています。私は今、その値を読む必要がありますが、私はSharedPreferencesに読み書きするときに並行性に関する多くの情報を見つけることができません。Android SharedPreferences並行処理

強制的に強制終了させる可能性を防ぐ/低くするには、自分のメソッドでsynchronizedキーワードを使用する必要がありますか?または、GoogleでSharedPreferencesを作成してもらえたら、これについて心配する必要はありませんか?

私はすべてのことがちょうど "うまくいく"とは思っていませんが、まれにしか読み書きできないため、衝突の可能性はあまりありません。

答えて

3

SharedPreferencesを開くときは、フラグMODE_MULTI_PROCESSを使用してください。これはGingerbread(Android 2.3)の以前の(しかし文書化されていない)振る舞いであり、このフラグはそのようなリリースをターゲットにしているときに暗示されています。 Android 2.3以上のSDKバージョンをターゲットとするアプリケーションでは、必要に応じてこのフラグを明示的に設定する必要があります。

この定数は、23
MODE_MULTI_PROCESSは、Androidの一部のバージョンでは確実に動作せず、さらに、プロセス間での同時変更を調和するための任意のメカニズムを提供していないAPIレベルで廃止されました。アプリケーションはそれを使用しようとすべきではありません。代わりに、ContentProviderのような明示的なプロセス間データ管理アプローチを使用する必要があります。

+0

このフラグは、同じSharedPreferencesが複数のプロセスで使用されている場合にのみ有効ですが、同じプロセスで実行されている特定のものは実行しません。 – 3c71

1

として、android doc

注:現在、このクラスは複数のプロセスでの使用をサポートしていません。これは後で追加されます。

共有プリファレンスへのマルチスレッドアクセスが心配な場合は、同期する必要があります。

+0

SharedPreferencesが1つのプロセス内でマルチスレッド化されているかどうかにかかわらず、同期化は不要です。しかし、複数のプロセスにわたって使用されている場合に問題が発生する可能性があります。プロセスが「ディスク」にプリファレンスを書き込んでいる間に、それを読み取ろうとする他のプロセスは失敗し、インストール後のものと同様のClean/empty SharedPreferencesを取得します。 – 3c71

+0

@ 3c71私は、異なるプロセスで動作するUIとServiceの間でsharedPreferencesに同時にアクセスするときに、この非常に問題に遭遇しています。プロセス間でコールを「同期」させるにはどうすればよいですか? – Flyview

+0

@Flyview:私は "新しい質問をする"ことをお勧めします。新しい質問ではこの質問を参照として使用できます。そのアプローチを試してもうまくいかなかった場合は、新しい質問に試したことを入れてください。 – kosa