25

SharedPreferencesの値を更新しようとしています。ここに私のコードがあります:

edit = PreferenceManager.getDefaultSharedPreferences(this).edit();
edit.putString(Settings.PREF_USERNAME+"",txtuser);
edit.putString(Settings.PREF_PASSWORD+"",txtpass);
edit.commit();" 

問題は、この値にアクセスしているときに、更新された値が返されず、SharedPreferences の値が返されることです。

しかし、XMLファイルのデータを確認していると、その中でデータが更新されました。

そして、アプリケーションを再起動した後、更新された値を取得しています。したがって、更新された値を取得するには、アプリケーションを再起動する必要があります。
では、変更後に更新された値を取得する方法は?

前もって感謝します

ここに私のコード全体があります:

@Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.main);
        ctx=this;

            status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value
        submit.setOnClickListener(new View.OnClickListener() {
          @Override
            public void onClick(View v) {

                  on(ctx,true);//  function will call and value is updated

                }
            }});    

     status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value

    }
    public static boolean on(Context context) {
        return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON);
    }

    public static void on(Context context,boolean on) {
            if (on) Receiver.engine(context).isRegistered(); //
        }




**********in reciver file***********
public void isRegistered ) {
        Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit();
        edit.putString(Settings.PREF_STATUS+"","0");
        edit.commit();
}
4

6 に答える 6

71

を使用する代わりに、 を使用edit.commit();する必要がありますedit.apply();適用すると、設定オブジェクトが即座に更新され、新しい値が非同期に保存されるため、最新の値を読み取ることができます。


専念()

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

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

戻り値を気にせず、アプリケーションのメイン スレッドからこれを使用している場合は、代わりに apply() の使用を検討してください。

申し込み()

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

2 人のエディターが同時に設定を変更している場合は、最後に適用を呼び出したエディターが優先されることに注意してください。

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

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

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

于 2012-04-17T06:55:31.883 に答える
1

それがあなたを助けることを願っています..

SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor prefsEditr = mypref.edit();
prefsEditr.putString("Userid", UserId);
prefsEditr.commit();


String task1 = mypref.getString("Userid", "");
于 2012-04-17T06:37:46.353 に答える
0

このようにしてみて、

public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.apply()
于 2022-01-15T14:46:55.097 に答える
0

このコードを試してください:

SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor1 = edit.edit();
editor.putString(Settings.PREF_USERNAME + "", txtuser);
editor.putString(Settings.PREF_PASSWORD + "", entered_name);
editor.commit();
于 2012-04-17T06:40:14.050 に答える
-1

このようにしてみてください、

public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.commit();    
于 2012-04-17T06:33:02.360 に答える