SharedPreferences似乎没有保存变量

时间:2016-11-13 15:13:49

标签: java android android-sharedpreferences

我有一个实现SharedPreferences的类,但每当我尝试保存数据或获取数据时,它似乎都没有。

public class SharedPreferenceManager {

public SharedPreferenceManager() {
    super();
}

public static final String FILENAME = "PREFERENCES_FILE";

public static void saveData(Context context, String key, String data)
{
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, data);
    editor.apply();
}

public static String getData(Context context, String key){
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
    String data = sharedPreferences.getString(key, null);
    return data;
}

public static void removeData(Context context, String key){
    SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.remove(key);

}
}

这是我保存数据的地方:

public class CreateUserActivity extends Activity {
EditText txtName, txtEmail, txtPassword;
AlertDialogManager alert = new AlertDialogManager();
private String token;
private SharedPreferenceManager sharedPreferenceManager;

public void setToken(String token) {
    this.token = token;
}

public String getToken() {
    return token;
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create_user_activity);
    txtName = (EditText) findViewById(R.id.loginName);
    txtEmail = (EditText) findViewById(R.id.loginEmail);
    txtPassword = (EditText) findViewById(R.id.loginPassword);
    sharedPreferenceManager = new SharedPreferenceManager();
}

public void checkCreateUser(View view) throws JSONException {
    String name = txtName.getText().toString();
    String email = txtEmail.getText().toString();
    String password = txtPassword.getText().toString();
    String token = getToken();

    CheckBox checkBox = (CheckBox) findViewById(R.id.login_remember_checkbox);
    if (name.trim().length() > 0 && password.trim().length() > 0 && email.trim().length() > 0) {
        JSONObject userObj = new JSONObject();
        userObj.put("name", name);
        userObj.put("email", email);
        userObj.put("password", password);
        String jsonDocument = userObj.toString();
        PostUserTask put = new PostUserTask();
        put.execute("http://api.evang.dk/v2/users", jsonDocument);
        if (checkBox.isChecked()) {
            sharedPreferenceManager.saveData(CreateUserActivity.this, "USERNAME", name);
            sharedPreferenceManager.saveData(CreateUserActivity.this, "EMAIL", email);
            sharedPreferenceManager.saveData(CreateUserActivity.this, "PASSWORD", password);
            sharedPreferenceManager.saveData(CreateUserActivity.this, "TOKEN", token);
        } else {
            sharedPreferenceManager.removeData(CreateUserActivity.this, "USERNAME");
            sharedPreferenceManager.removeData(CreateUserActivity.this, "EMAIL");
            sharedPreferenceManager.removeData(CreateUserActivity.this, "PASSWORD");
            sharedPreferenceManager.removeData(CreateUserActivity.this, "TOKEN");
        }
    }
    else
    {
        alert.showAlertDialog(CreateUserActivity.this, "Login failed!", "Please enter name, username and password", false);
    }
    Intent i = new Intent(getBaseContext(), UserActivity.class);
    i.putExtra("SESSIONID", token);
    i.putExtra("NAMEID", name);
    startActivity(i);
}

我在哪里阅读SharedPreferences的数据:

EditText userNameTxt, passwordTxt, emailTxt;
SharedPreferenceManager sharedPreferenceManager;
String token;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    Intent intent = getIntent();
    userNameTxt = (EditText) findViewById(R.id.userNameLogin);
    passwordTxt = (EditText) findViewById(R.id.passwordLogin);
    emailTxt = (EditText) findViewById(R.id.emailLogin);
    sharedPreferenceManager = new SharedPreferenceManager();
    String userName = sharedPreferenceManager.getData(getBaseContext(), "USERNAME");
    String email = sharedPreferenceManager.getData(getBaseContext(), "EMAIL");
    String password = sharedPreferenceManager.getData(getBaseContext(), "PASSWORD");
    token = sharedPreferenceManager.getData(getBaseContext(), "TOKEN");
    if(userName != null && email != null && password != null && token != null)
    {
        userNameTxt.setText(userName);
        emailTxt.setText(email);
        passwordTxt.setText(password);
    }
}

1 个答案:

答案 0 :(得分:1)

  • 因为在saveData(...)中,您使用的是editor.apply()而不是editor.commit(),所以在您阅读之前,您的数据可能尚未写入文件。 (editor.apply()是异步的,不会像editor.commit()
  • 那样立即将更改写入磁盘

请尝试使用editor.commit(),如下所示:

public static void saveData(Context context, String key, String data)
{
SharedPreferences sharedPreferences = context.getSharedPreferences(FILENAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, data);
editor.commit();
}