web-dev-qa-db-ja.com

共有設定の値を変更する方法

ユーザーがログインするために共有設定を使用するアプリケーションを作成しました。ユーザーのパスワードは設定に保存されます。私の問題は、ユーザーが自分のパスワードを変更したい場合、どのように設定でパスワードを変更できるかということです。

22
sean
SharedPreferences prefs = ... // you already know how to use prefs and have one of this objects
Editor editor = prefs.edit();
editor.putString("password", "new value");
editor.apply();
47
Cristian

apply()の代わりにcommit()を使用してください

Editor.apply()は非同期で動作するため、commit()の代わりにapply()を使用することを推奨します。したがって、バックグラウンドでは、そのためにANRが発生する可能性は低くなります(あるとしても)。

_getSharedPreferences("FILE_NAME", 0 /*FILE_MODE*/)
     .edit()
     .putString("password", "new value")
     .apply();
_

ドキュメントの言及apply()について、

このエディターから編集中のSharedPreferencesオブジェクトにプリファレンスの変更をコミットします。これにより、要求された変更がアトミックに実行され、現在SharedPreferencesにあるものがすべて置き換えられます。

2人の編集者が同時に設定を変更している場合、最後に適用を呼び出した方が優先されることに注意してください。

設定を永続ストレージに同期的に書き込むcommit()とは異なり、apply()は変更をメモリ内のSharedPreferencesにすぐにコミットしますが、ディスクへの非同期コミットを開始しますそしてあなたはどんな失敗についても通知されません。このSharedPreferencesの別のエディターがapply()がまだ未処理のときに通常のcommit()を実行すると、commit()は、コミット自体だけでなく、すべての非同期コミットが完了するまでブロックします。

SharedPreferencesインスタンスはプロセス内のシングルトンであるため、戻り値をすでに無視している場合は、commit()のインスタンスをapply()に置き換えても安全です。

Androidコンポーネントのライフサイクルと、ディスクへのapply()書き込みとの相互作用について心配する必要はありません。フレームワークは、状態を切り替える前に、apply()からの実行中のディスク書き込みが完了することを確認します。

8
pulp_fiction