Почему мои 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(); потому что с коммитом храните данные немедленно.

Другие вопросы по тегам