Я работаю с очень странным поведением с SharedPreferences. Мне интересно, сталкиваюсь ли я с проблемой синхронизации.
Кажется, что приложение может помнить изменения предпочтений между действиями, но не при перезапуске приложения. Состояние всегда возвращается к самому первому экземпляру, в котором я создал предпочтение. Я следовал нескольким примерам, учебным пособиям и android документациям, которые все предлагают похожий макет кода. Я также наблюдал за изменением файла настроек. xml при взаимодействии с моим кодом с помощью отладчика, и я подтвердил, что он выглядит как обновленная пара ключ-значение.
Могу ли я столкнуться с проблемой синхронизации с моим эмулятором? Я попытался использовать оба метода editor.apply () и editor.commit () с одинаковыми результатами. Единственное, что я нашел, что решает мою проблему, это использование метода editor.clear (), но это выглядит немного странно ...
примечание: пожалуйста, простите имена переменных, я делаю pokedex ...
public class SecondActivity extends AppCompatActivity {
private boolean caught;
private Set<String> pokemonCaught;
private String pokemonName;
public SharedPreferences sharedPreferences;
public static final String SHARED_PREFERENCES = "shared_preferences";
public static final String PREF_KEY = "inCaughtState";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
/*SKIPPING THE VIEW SETUP*/
/*SKIPPING BUTTON VIEW ATTRIBUTES*/
//variables required for changing button state
pokemonName = (String) nameTextView.getText();
caught = false;
//Loading in sharedPreferences
sharedPreferences =
getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
pokemonCaught = sharedPreferences.getStringSet(PREF_KEY, new HashSet<String>());
if (pokemonCaught.contains(pokemonName)) {
toggleCatch(catchButton);
}
}
public void toggleCatch (View view) {
//Editing and updating preferences
sharedPreferences =
getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
if (caught == true) {
/*SKIPPING BUTTON ATTRIBUTES*/
caught = false;
pokemonCaught.remove(pokemonName);
}
else {
/*SKIPPING BUTTON ATTRIBUTES*/
caught = true;
pokemonCaught.add(pokemonName);
}
editor.clear(); //This is my hacky solution...
editor.putStringSet(PREF_KEY, pokemonCaught);
editor.apply();
}
}