SharedPreferences сохраняет состояние между android действиями, но не после перезапуска приложения - PullRequest
0 голосов
/ 19 апреля 2020

Я работаю с очень странным поведением с 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();
    }
}

1 Ответ

0 голосов
/ 19 апреля 2020

Попробуйте использовать SharedPreferences следующим образом:

Для сохранения данных

SharedPreferences.Editor editor = getSharedPreferences("PREFS", MODE_PRIVATE).edit();
            editor.putString("stringName", "stringValue");
            editor.apply();

Для извлечения данных

SharedPreferences preferences = getApplicationContext().getSharedPreferences("PREFS", MODE_PRIVATE);
String name = preferences.getString("stringName", "none"));

Обратите внимание, что это "нет" в случае строка "stringName" будет нулевой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...