共享首选项android基本问题

时间:2011-08-11 14:22:01

标签: android login sharedpreferences data-storage

我首次打开应用并将其存储在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...
    }
}

但每次打开应用程序时,都会要求我输入用户名和密码。
我究竟做错了什么?如何实现所需的功能?
谢谢。

3 个答案:

答案 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();