应用重启后,共享首选项不会持久

时间:2014-06-18 09:52:53

标签: android save preferences shared persistent

我在这里找到了所有答案并尝试了所有解决方案,但我的共享首选项仍然没有持久性。

这是我的代码:

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();

我甚至尝试过使用.apply()和.commit()而没有运气。

另一个想法是尝试对文件使用不同的模式:

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

问题是保存的值不是持久的。如果我关闭应用程序然后重新打开它,则值都是错误的。

有没有人有任何想法?我还要提到问题仅出现在某些设备上,例如HTC One S,三星Galaxy S3(我在不同的S3上测试过,它运行良好)。

编辑:我在按钮单击侦听器上调用save,并在加载片段时调用isActivated(在onViewCreated()之后)。

谢谢!

3 个答案:

答案 0 :(得分:3)

public abstract SharedPreferences.Editor clear()
  

在API级别1中添加在编辑器中标记以从中删除所有值   喜好。一旦调用commit,就会剩下唯一的首选项   将是您在此编辑器中定义的任何内容。请注意,当   回到首选项,先做清楚,   无论你是否在put方法之前或之后调用clear   这个编辑。

     

返回返回对同一Editor对象的引用,因此可以   链把电话放在一起。

在我的用户首选项类中,我在其他一些字符串上得到一个空值,我的代码是这样的:

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()正在重置我的所有其他提交!

答案 1 :(得分:1)

嗨,我认为它应该有效。如果清除不起作用,您可以尝试我的解决方案中详述的第二个选项:

您有两个选择:

  1. 在活动的生命周期内获取共享偏好值。

  2. .clear

  3. 之前致电.commit

    见我的回答:

    Android Persistent Checkable Menu in Custom Widget After Reboot Android

答案 2 :(得分:0)

我不知道为什么,但只是将你的prefs代码放在异步任务中就可以了:

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;
    }
}