Общие настройки не сохраняются после перезапуска приложения

Я нашел все ответы здесь и попробовал все решения, но мои общие префы не являются постоянными.

вот мой код:

public static void setActivated(boolean activated) {
    SharedPreferences sp = Utils.getContext().getSharedPreferences(
            USER_PREFS, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit(); 
    editor.putBoolean(ASD, activated);
    editor.commit();
}

public static boolean isActivated() {
    SharedPreferences sp = Utils.getContext().getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE);
    return sp.getBoolean(ASD, true); 
}

Я тоже пробовал:

editor.clear();
editor.put ..
editor.commit();

Я также пробовал с

editor.apply();

Я даже пытался с обоими .применять и. совершить() и не повезло.

другой идеей было попробовать использовать другой режим для файлов:

...getSharedPreferences(USER_PREFS, Context.MODE_MULTI_PROCESS);

проблема в том, что сохраненные значения не сохраняются. Если я закрою приложение а затем снова откройте его, все значения неправильны.

у кого-нибудь есть идеи? Я бы также упомянул, что проблема только на некоторых устройствах, например HTC One S, Samsung Galaxy S3 (я тестировал на другом S3, и он работал отлично).

EDIT: я вызываю save on a button click listener и вызываю isActivated при загрузке фрагмента (после onViewCreated ()).

спасибо!

3 ответов


public abstract SharedPreferences.Editor clear()

добавлена отметка уровня API 1 в редакторе для удаления всех значений из предпочтения. Как только commit вызывается, единственные оставшиеся настройки будет любой, который вы определили в этом редакторе. Обратите внимание, что когда фиксация назад к предпочтениям, clear делается первым, независимо от того, вызывали ли вы clear до или после put methods on этот редактор.

Returns возвращает ссылку на тот же объект редактора, так что вы можете цепочка вызовов put вместе.

в моем классе пользовательских настроек я получал нулевое значение в некоторых других строках, и мой код был примерно таким:

SharedPreferences sp = Utils.getContext()
    .getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if (session != null && !"".equals(session)) {
    sessionId = session;
    editor.putString(SESSION, sessionId).commit();
} else {
    sessionId = null;
    editor.clear().commit();
}

на editor.clear() сбрасывал все мои другие коммиты!


Привет я думаю, что это должно работать. Если очистка не работает, вы можете попробовать второй вариант, как описано в моем решении:

у вас есть 2 варианта:

  1. получить общее значение предпочтения в течение жизненного цикла деятельности.

  2. вызов .clear до .commit

смотрите мой ответ:

Android постоянное проверяемое меню в пользовательском виджете после перезагрузки Android


Я не знаю, почему, но он работает, просто помещая ваш код префов внутри асинхронной задачи:

prefss = getSharedPreferences(ACCOUNT_PREFS_NAME, MODE_MULTI_PROCESS);
new AsyncSave(favNamesList).execute();
private static class AsyncSave extends AsyncTask<Void, Void, Boolean> {
    String favNamesList;

    AsyncSave(String favNamesList) {
        this.favNamesList = favNamesList;
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        prefss.edit().putString("favNamesList", strings).apply();
        return null;
    }
}