【问题标题】:App keeps forgetting sharedpreferences on restart应用程序在重新启动时不断忘记共享首选项
【发布时间】:2016-05-03 16:44:17
【问题描述】:

我不知道该怎么办了

似乎在 android 3.0 及更高版本上运行良好,但在 android 2.3.3 上,每次我启动应用程序时都会再次询问用户名/密码。

我正在使用共享首选项。

这是我保存首选项的方法:

        SharedPreferences preferences = MyApplication.getAppContext().getSharedPreferences("athopbalance", MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("username", username).commit();
        editor.putString("password", password).commit();

这是我阅读它们的方式:

    SharedPreferences preferences = MyApplication.getAppContext().getSharedPreferences("athopbalance", Context.MODE_PRIVATE);
    String username = preferences.getString("username", "");
    String password = preferences.getString("password", "");

我还尝试使用此代码保存首选项:

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getAppContext());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("username", username).commit();
        editor.putString("password", password).commit();

然后用这段代码阅读它们:

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getAppContext());
    String username = preferences.getString("username", "");
    String password = preferences.getString("password", "");

但它也不起作用。

问题是在我重新启动应用程序之前,我可以看到它们仍然存在。但是,一旦我重新启动 - 我最终会得到“”(空字符串)作为用户名和“”作为密码。

任何想法将不胜感激

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:
    public class MyApplication extends Application {
        private static MyApplication instance;
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.d(TAG, "onCreate() called");
        }
    
        public MyApplication() {
            super();
            Log.d(TAG, "Constructor called");
            instance = this;
        }
    
    
        public static MyApplication getApplication() {
            if (instance == null) {
                instance = new MyApplication();
            }
            return instance;
        }
    }
    

    及用法:

    MyApplication.getApplication().getSharedPreferences(MY_PREFERENCES, Context.MODE_PRIVATE)
    

    【讨论】:

    • 您的示例在返回之前没有将new MyApplication 保存到实例中,因此缓存永远不会发生。
    • 谢谢,我试试看
    【解决方案2】:

    试试这个:

     SharedPreferences preferences = context.getSharedPreferences("YOUR_TAG", 0);
     String username = preferences.getString("username", "");
     String password = preferences.getString("password", "");
    
    
      SharedPreferences.Editor editor = preferences.edit();
        editor.putString("username", username).commit();
        editor.putString("password", password).commit();
    

    context 是应用的上下文:

      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    
            context = this;
    

    【讨论】:

    • 您好,非常感谢您的评论。在我的第一个示例中,我的做法几乎相同,但恐怕它不起作用
    • 尝试使用您的活动而不是 MyApplication。
    • 我在调用 getApplicationContext() 而不是从 Activity 传递上下文。
    【解决方案3】:

    你有两个选择:

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

    2. .commit之前调用.clear

    看我的回答:

    Android Persistent Checkable Menu in Custom Widget After Reboot Android

    【讨论】:

      【解决方案4】:

      我不知道到底发生了什么,但是在我重新启动后,模拟器问题就消失了。

      很抱歉浪费您的时间

      【讨论】:

      • 这里有同样的问题,重启后就和你的一样了。真奇怪……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多