【问题标题】:Android SharedPref not saving on restartAndroid SharedPref 不会在重启时保存
【发布时间】:2016-12-06 10:10:48
【问题描述】:

在我的 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 是否已满?

【问题讨论】:

    标签: android save sharedpreferences exit restart


    【解决方案1】:

    像这样试试。

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

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

    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(name,mode) 需要指明特定的首选项(文件)名称和操作模式(例如私有、world_readable 等),以便更好地访问您的 SharedPref 文件。

    【讨论】:

    • 我不会在不了解问题原因的情况下盲目地复制一些随机代码。
    • 通过 SO 更新完整类
    • 对不起,我不能接受这个。它无论如何都没有回答原始问题。我不需要代码。我需要回答为什么重启后首选项会丢失
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多