Android SharedPref在重新启动时不保存

时间:2016-12-06 10:10:48

标签: android save sharedpreferences exit restart

在我的Android应用中,我可以在应用更新时显示弹出窗口(基于versionCode)。在弹出窗口中,我放了一个复选框,上面写着“别再告诉我”。当我点击它时,它将保存在sharedpref versionCode中,并且不再显示弹出窗口。

我遇到了一些奇怪的行为,当我保存新的Set<String>时,它确实保存了它,但是当我的应用程序重新启动时,设置就丢失了。

Set<String> readAnnouncement = getReadAnnouncement(this);
readAnnouncement.add(String.valueOf(versionCode));   
PreferenceManager.getDefaultSharedPreferences(this).edit().putStringSet(KEY_READ_ANN, readAnnouncement).apply();

如果我在readAnnouncement.add上断点,我可以设置例如包含2个项目的列表。当我执行PreferenceManager.getDefaultSharedPrefer...然后执行getReadAnnouncement(this);时,值就在那里,一切都很好。

如果我重新启动应用并再次检查getReadAnnouncement(this);,新值就会消失。

通过清除缓存,问题就消失了......为什么不能保存? SharedPreference是否可能已满?

1 个答案:

答案 0 :(得分:0)

试试这样。

import android.content.Context;
import android.content.SharedPreferences;
/**
 * @author VIVEK
 *         This class deals in with setting Cache value for complete app.
 */
public class SharedPrefUtil{

    /*Set Boolean value in shared preferences */
    public static void setSharedPref(Context context, String key, boolean value) {
        // save token in preference
        SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    /*get Boolean value in shared preferences */
    public static boolean getSharedPref(Context context, String key, boolean defaultVal) {
        boolean prefToken = defaultVal;
        SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0);
        prefToken = sharedPreferences.getBoolean(key, false);
        return prefToken;
    }

    /*Set String value in shared preferences */
    public static void setSharedPref(Context context, String key, String value) {
        // save token in preference
        SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /*get String value in shared preferences */
    public static String getSharedPref(Context context, String key, String defaultVal) {
        String value = defaultVal;
        SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0);
        value = sharedPreferences.getString(key, defaultVal);
        return value;
    }

    public static void cleanSharedPrefFile(Context context) {
        // save token in preference
        SharedPreferences sharedPreferences = context.getSharedPreferences("usb", 0);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.commit();
    }

} // End of main class over here ...

现在你想在Shared Pref中设置一些值然后像这样设置

SharedPrefUtil.setSharedPref(MainActivity.this, "test", storeBuff);

现在,当您需要从共享Pref获取价值时,请像这样调用

SharedPrefUtil.getSharedPref(MainActivity.this, "test", "default value");

代替editor.commit(),使用editor.apply()

<强>基础:

getDefaultSharedPreferences()使用默认的首选项文件名。此默认值是针对每个应用程序设置的,因此同一应用程序上下文中的所有活动都可以轻松访问它,如以下示例所示:

SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
if (spref.contains("email")) {
     String sEmailAddr = spref.getString("email", "");
}

偏好设置通常存储在/data/data/com.package.name/shared_prefs/com.package.name_preferences.xml

替代方法 - getSharedPreferences(名称,模式)需要指示特定的首选项(文件)名称和操作模式(例如private,world_readable等),这样可以更好地访问SharedPref文件。