web-dev-qa-db-ja.com

SharedPreferences値は更新されません

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();
}
23
Juned

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


commit()

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

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

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

apply()

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

2人の編集者が同時に設定を変更している場合は、applyを最後に呼び出した方が優先されます。

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

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

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

70
waqaslam

ええと、質問の3年後に私の答えが返ってきたとしても、それが役に立てば幸いです。問題はコミットや適用からではなく、コード構造から発生しているようです。

説明しましょう:スマートフォンではAPPを実行しますが、コンピューターで行うようにAPPを終了しません。つまり、スマートフォンのメニューに戻ったとき、アプリはまだ「実行中」です。 APPアイコンをもう一度「クリック」すると、APPを再実行するのではなく、起動します。 junedコードでは、彼がCreate関数内でgetDefaultSharedPreferencesを呼び出していることがわかります。

そのため、彼は初めてAPPを実行するときにgetDefaultSharedPreferencesを呼び出します。しかし、彼がAPPをバックグラウンドで設定し、その後APPを起動すると、呼び出しは行われません。

同じ問題が発生しました。APPのSharedPreferenceがあるかどうかを確認します。そうでない場合は、ユーザーに値を尋ねるフォームを表示します。はいの場合、設定の日付を確認します。古すぎる場合は、フォームを確認します。フォームの後、現在の日付で設定を保存します。私が気づいたのは、SharedPreference(junedの場所と同じ場所に設定されている)の存在に関するテストがAPPの最初の実行時にのみ行われ、APPを起動したときに行われていないことです。これは、SharedPreferencesの制限時間を確認できなかったことを意味します。

それを解決するには?追加するだけです:

          @Override
          public void onResume(){
          super.onResume();
         // And put the SharedPreferences test here
          }

このコードは、APPの最初の実行時に呼び出されますが、ユーザーが起動するたびにも呼び出されます。

1
Peter

お役に立てれば幸いです。

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


String task1 = mypref.getString("Userid", "");
1
Nitesh Khosla

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

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();
1
Shankar Agarwal

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

public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.commit();    
0
wolverine