Почему мои SharedPreferences не получают нужные данные, когда я начинаю новую активность?
У меня два занятия LoginActivity
а также MainActivity
, Я аутентифицирую своего пользователя из LoginActivity
, Если пользователь был успешно аутентифицирован, я вызываю startActivity() с MainActivity
намерение. Это то, что LoginActivity
похоже:
В моем onCreate()
Я инициализировал свои объекты SharedPreferences, которые были объявлены как поля класса:
userInfo = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
editor = userInfo.edit();
Затем я обрабатываю логику аутентификации в login()
метод:
private void login() {
progressDialog.setIndeterminate(true);
progressDialog.setMessage("Authenticating...");
progressDialog.show();
final String email = emailText.getText().toString();
final String password = passwordText.getText().toString();
new android.os.Handler().postDelayed(new Runnable() {
public void run() {
ref.authWithPassword(email, password, new Firebase.AuthResultHandler({
// User was authenticated successfully
@Override
public void onAuthenticated(AuthData authData) {
@Override
public void onDataChange(DataSnapshot snapshot) {
UserSchema user = snapshot.getValue(UserSchema.class);
// store the user's name and email with our SharedPreferences
editor.putString("name", user.getName());
editor.putString("email", user.getEmail());
editor.apply();
}
});
// Dismiss the progress dialog shown while authenticating the user
progressDialog.dismiss();
// Start the MainActivity
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
}
}, 3000);
}
Я также инициализирую PreferenceManager в MainActivity onCreate()
:
userInfo = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
Сначала все работает нормально, но когда MainActivity
начинается, все вызовы, чтобы получить информацию о пользователе, которая была сохранена, возвращаются со значениями по умолчанию, которые я установил в MainActivity
учебный класс:
// returns the default value at first
String s1 = userInfo.getString("name", "name");
String s2 = userInfo.getString("email", "email");
Странная часть: если я закрою приложение из последних устройств и перезапущу его, правильные значения имени пользователя и адреса электронной почты будут отображаться правильно.
2 ответа
Заметить, что onDataChange
это обратный вызов, и он не будет вызван сразу, но startActivity
вызывается до того, как будет выполнен обратный вызов. Так, MainActivity
вызывается перед сохранением данных в SharedPreference
,
Код должен быть таким
private void login() {
...
// User was authenticated successfully
@Override
public void onDataChange(DataSnapshot snapshot) {
UserSchema user = snapshot.getValue(UserSchema.class);
// store the user's name and email with our SharedPreferences
editor.putString("name", user.getName());
editor.putString("email", user.getEmail());
editor.apply();
// Start the MainActivity
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
}
}
Я не уверен, но попробуйте использовать editor.commit();
вместо editor.apply();
потому что с коммитом храните данные немедленно.