1

我在使用 SharedPreferences 时遇到了一些问题。我想保存并稍后将字符串加载到首选项中/从首选项中加载。我在 onCreate 方法中初始化我的首选项:

prefs = this.getSharedPreferences("com.example.android_test", Activity.MODE_PRIVATE);

我用另一种方法保存:

    public void saveUser()
    {   
        prefs.edit().putString("username", username);
        prefs.edit().putString("password", password);
        prefs.edit().apply();
    }

并加载另一种方法:

    public void loadUser()
    {
        username = prefs.getString("username", "default");
        password = prefs.getString("password", "test");
    }

这些是我的测试方法:

    public void showUser(View v) 
    {
       loadUser();
       text.setText(username);
    }

    public void addUser(View v)
    {
        changeUser(eingabe.getText().toString(),"newpass");
    }

    public void changeUser(String user, String pass)
    {
        username = user;
        password = pass;
        saveUser();
    }

用户名和密码是全局的私有字符串,eingabe 是 EditText,text 是 TextView。但是,在执行 showUser() 时,我只会将默认值显示到 TextView,即使我使用具有不同用户名的 saveUser ......没有崩溃或任何东西......它只是显示的默认值......

4

3 回答 3

8

您忘记提交您的编辑:

prefs.edit().putString("username", username).commit();
于 2013-04-11T11:51:17.820 回答
3
 prefs.edit().putString("username", username);
 prefs.edit().putString("password", password);

每次更改它edit都会返回不同的实例,因此您的更改不会被提交。

Editor editor = prefs.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.commit();

尝试这个。

与将其首选项同步写入持久存储的 commit() 不同,apply() 会立即将其更改提交到内存中的 SharedPreferences,但会开始异步提交到磁盘,并且不会通知您任何失败。如果此 SharedPreferences 上的另一个编辑器在 apply() 仍然未完成时执行常规 commit(),则 commit() 将阻塞,直到所有异步提交以及提交本身都完成。

于 2013-04-11T11:51:42.973 回答
1

好的, apply 与 commit 相同,它只是原子地写入首选项,使其线程安全。(虽然它需要 API 级别 9,所以要小心)

请参阅文档

问题在于 Rajesh CP 所说的。您需要创建一个编辑器指针,然后应用:

Editor editor = prefs.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.apply();

否则,每次创建编辑器的新实例并应用更改时,被指示应用更改的编辑器都没有任何更改

于 2013-04-11T11:58:50.697 回答