2017-02-10 15 views
0

У меня странная проблема. В одном действии у меня есть список с полями флажка, состояние флажка зависит от общего предпочтения, но это иногда и иногда не работает (иногда это означает, что когда я проверил флажок, а затем вернулся к предыдущему действию и вернусь в свою деятельность checkbox, Значение sharedPrefrences не изменяется). Я думал, что это случилось, потому что я слишком быстро меняю активность, поэтому я добавляю логику сохранения в поток, но получаю ту же проблему.boolean в sharedPreferences не всегда сохранять правильно

Вот код, который я пробовал:

public final static String PREFERENCES_NAME = "USER_PREFERENCES"; 
     public final static String PLAY_REQUIRED = "PLAY_REQUIRED"; 
      sharedPreferences = getSharedPreferences(PREFERENCES_NAME, Activity.MODE_PRIVATE); 
     recordCheckBox=(CheckBox)findViewById(R.id.recordRequiredCheckBox); 
     recordCheckBox.setChecked(sharedPreferences.getBoolean(PLAY_REQUIRED,true)); 
     findViewById(R.id.playRequiredItem).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
SharedPreferences.Editor preferencesEditor = sharedPreferences.edit(); 
       if(recordCheckBox.isChecked()) { 
        recordCheckBox.setChecked(false); 
        preferencesEditor.putBoolean(PLAY_REQUIRED, false).apply(); 
        preferencesEditor.commit(); 
        Log.i("kamil","AfterSetFalseCheckBox :: "+ sharedPreferences.getBoolean(PLAY_REQUIRED,true)); 
       } 
       else { 
        recordCheckBox.setChecked(true); 
        preferencesEditor.putBoolean(PLAY_REQUIRED, true).apply(); 
        preferencesEditor.commit(); 
        Log.i("kamil","AfterSetTrueCheckBox :: "+ sharedPreferences.getBoolean(PLAY_REQUIRED,true)); 
       } 
      } 
     }); 
+0

Удалить. подать заявление() . apply() используется для асинхронного сохранения в SP. –

+0

Удалить AsyncTask и использовать прямые предпочтенияEditor.putBoolean (PLAY_REQUIRED, check) .apply(); preferencesEditor.commit(); –

+0

попробуйте удалить getApplicationContext(). 'Из' sharedPreferences = getApplicationContext(). GetSharedPreferences (PREFERENCES_NAME, Activity.MODE_PRIVATE); ' –

ответ

0

Вы можете использоваться ниже способ набора и получить логическое значение.

/Для Set Логическое значение в предпочтении/

public void setBooleanValue(String key, boolean value, Context context) { 

    SharedPreferences preferences = context.getSharedPreferences(
      context.getPackageName(), Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean(key, value); 
    editor.commit(); 
} 

/Для Получить логическое значение в предпочтении/

public boolean getBooleanValue(String key, Context context) { 

    SharedPreferences preferences = context.getSharedPreferences(
      context.getPackageName(), Context.MODE_PRIVATE); 
    boolean value = preferences.getBoolean(key, false); 
    return value; 
} 
+0

Не его проблема пытается понять вопрос. @Expiredmind сделал это также. –

1

Я думаю, что это произошло потому, что всякий раз, когда вам поместите значение в sharedpreference, а не значение, вставленное в один sharedprefrences, и когда вы получаете значение из sharedpreference, получая от другого sharedpreference. Поэтому я предлагаю вам создать правильный вспомогательный класс для sharedpreference и использовать его, когда захотите.

Вот пример того, что:

public class PreferenceHelper { 

    public static SharedPreferences AppPreference; 

    // Preference name for app. 
    public static final String APP_PREFERENCE_NAME = "app_preference_name"; 

    /** 
    * Set boolean value to shared-preference. 
    * 
    * @param key Key for store boolean value to shared-preference. 
    * @param value Boolean value to be stored in shared-preference for given key. 
    */ 
    public static void putBoolean(Context context,String key, boolean value) { 
     AppPreference = context 
       .getSharedPreferences(APP_PREFERENCE_NAME, Context.MODE_PRIVATE); 
     Editor editor = AppPreference.edit(); 
     editor.putBoolean(key, value); 
     editor.commit(); 
    } 

    /** 
    * Get boolean value from shared-preference. 
    * 
    * @param key   Key for getting boolean value from shared-preference. 
    * @param defaultValue Default boolean value that is returned if given key is not found in 
    *      preference. 
    * @return string  Boolean value from shared-preference for given key. 
    */ 
    public static boolean getBoolean(Context context,String key, boolean defaultValue) { 
     AppPreference = context 
       .getSharedPreferences(APP_PREFERENCE_NAME, Context.MODE_PRIVATE); 
     boolean string = AppPreference.getBoolean(key, defaultValue); 
     return string; 
    } 
} 

и использовать его как:

Чтобы установить значение:

PreferenceHelper.putBoolean(getApplicationContext(),"key",value); 

Чтобы получить значение:

Boolean boolean = PreferenceHelper.getBoolean(getApplicationContext(),"key",defalut-value);