私のアプリケーションのユーザーの何人かは、時々(ランダムな方法で)私のアプリケーションの設定がデフォルトの状態に戻る(通常は電話の再起動後)と不平を言います。しかし、私は問題を再現することができませんでした。アプリの多くの場所に、共有設定エディターを呼び出して変更をコミットするコードがあるためだと思います-にいくつかの変更をコミットしようとすると、共有設定ファイルの破損を解決できますか?同時に同じ設定ファイル? (マルチスレッドアプリケーション)
私は本当に迷っています。私は何時間もウェブを調べて解決策を見つけようとしましたが、成功しませんでした。
誰かがアイデアさえ持っていて、私が調査を始めることができれば、私は感謝するでしょう。
ありがとう、アミット・モラン
他の答え(ファイルを破損したくない場合は競合を回避する必要がある)をエコーします。さらに、SharedPreferencesを誤用している可能性があることを示唆します。
SPは、アプリに関する小さな情報(音量などのユーザー設定、音楽の再生中かどうかなど)を保存するように設計されています。
SPは、頻繁に変更されるデータや大量のデータを格納するようには設計されていません。これを実行することはお勧めできません(発見した理由やその他の理由から)。
SPは実際には単なるXMLファイルであることに注意してください。変更するたびに、SPを解析して再作成するオーバーヘッドが発生します。
複数のスレッドでSPを更新するアプリのアイデアは少し狂っていると思います-保存しているデータを管理および保存するためのより良い方法が必要です-それは複数の方法であなたに利益をもたらします。 。
SharedPreferences.Editorのドキュメント によると:
2人の編集者が同時に設定を変更している場合、最後にcommitを呼び出した方が優先されることに注意してください。
このことから、複数の同時コミットでは設定が消去されないことがわかりましたが、複数のEditor
インスタンスが同時に使用されている場合、書き込もうとしているすべての変更が書き込まれるとは限らない可能性があります。これを回避するには、すべての設定変更を同期ブロックに配置するか、すべての設定書き込みに1つの同期静的メソッドを使用することもできます。
シングルトンを使用して設定を管理することをお勧めします。 true Java singleton を実装するか、Androidの を使用してこれを行うか)アプリケーションコンテキスト はあなた次第です(それぞれの/に対するいくつかの良い議論については この質問 を参照してください)
SharedPreferences
のようなものの場合、これは特にマルチスレッドアプリケーションの場合にそれらを管理するための良い方法です。これにより、コミットが互いに競合しているかどうかの問題の一部が解消される可能性があります。これは全体の問題ではないかもしれませんが、それはどこかで始まります。
同様の問題がありました。設定が確実に保存されていませんでした。一部のデバイス(私の場合はXOOM-Tablet)では、データが失われることもあれば、失われないこともありました。新しいデータをコミットする前に、エディターでclear()を呼び出すだけで、問題を解決しました。
エディターを開いてSharedPreferences
を実行し、次にgetString
を実行せずにcommitting
を実行すると、putString
の特定のエントリが失われていることがわかりました。必要な変更がなかった場合でも、最初に入力します。何があっても値を保存するためにputString
をスタブすると、エントリはcommit
の後で消えなくなりました。