我首次打开应用并将其存储在SharedPreferences对象中时保存用户的用户名和密码。我第二次进入时检查数据,如果它不为空,那么我进入了应用程序。以下是我这样做的方式:
private SharedPreferences dhj;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dhj = this.getSharedPreferences("DHJ", MODE_WORLD_READABLE);
if(dhj.getString("username", null) != null) {
setContentView(R.layout.main);
// do some stuff...
}
else {
setContentView(R.layout.login);
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.loginButton);
loginButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor dhjEditor = dhj.edit();
dhjEditor.putString("username", username.getText().toString());
dhjEditor.putString("password", password.getText().toString());
setContentView(R.layout.main);
}
});
// do some other stuff...
}
}
但每次打开应用程序时,都会要求我输入用户名和密码。
我究竟做错了什么?如何实现所需的功能?
谢谢。
答案 0 :(得分:3)
请注意,editor.commit()
函数是执行文件系统操作的同步函数。从主线程调用此代码(您的代码似乎在主线程中运行)可能 - 在不幸的情况下 - 抛出ANR,因为文件系统操作可能会停止,从而阻塞主线程。
我会使用editor.apply()
函数,因为它会立即更新共享首选项的内存缓存,然后创建一个工作线程并从那里将值写入共享首选项文件(工作线程不要“阻止主线程。”
http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()
答案 1 :(得分:2)
“getSharedPreferences”的文档说:
所需的偏好文件。如果不存在此名称的首选项文件,则在检索编辑器(SharedPreferences.edit())然后提交更改(Editor.commit())时将创建该文件。
确保在提交之前对所有写作使用相同的编辑器,例如
Editor editor = mPref.edit();
editor.putString("username", username);
editor.putString("password", password);
editor.commit();
答案 2 :(得分:1)
在对首选项进行任何更改后,您需要调用编辑器的commit
方法。这将保存首选项文件:
SharedPreferences.Editor dhjEditor = dhj.edit();
dhjEditor.putString("username", username.getText().toString());
dhjEditor.putString("password", password.getText().toString());
dhjEditor.commit();