2013-04-11 163 views
1

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

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,文本是TextView。 但是,执行showUser()时,我只能得到显示给TextView的默认值,即使我用不同的用户名使用saveUser ...没有崩溃或任何东西...它只是只显示默认值...

回答

8

你忘了你的承诺编辑:

prefs.edit().putString("username", username).commit(); 
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(); 

试试这个。

不像提交(),其出持久 存储同步写其首选项,适用()提交其对立即 SharedPreferences内存的变化,但启动异步承诺 磁盘,你会不会通知任何失败。如果 这个SharedPreferences另一个编辑器并定期提交(),而适用()是 依然突出,提交()将阻塞,直到所有异步提交的 完成以及提交本身。

1

确定,应用是同犯,只写了首原子使它线程安全的。 (它需要API 9级了,所以要小心)

the documentation

的问题是什么拉杰什CP在说什么。 您需要创建一个编辑器指针,然后应用:

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

否则,您创建的每个编辑器的新实例,当你应用更改,正被指示编辑器应用更改时间,没有按没有任何变化

+0

好吧,我已经将它改为edit.putString(“username”,username).commit(); ...我还需要edit.apply();命令? – 2013-04-11 12:05:44

+1

不可以。您可以选择两种解决方案之一。在我的看法中,Rajesh提供的解决方案在代码编写方面更“干净”。但是,你当然可以在线进行编辑。 – Lefteris 2013-04-11 12:09:15