Когда я запускаю приложение в первый раз, имя пользователя равно нулю - PullRequest
0 голосов
/ 07 октября 2018
public class SplashActivity extends AppCompatActivity {

    private final int SPLASH_DISPLAY_LENGTH = 1000;
    private FirebaseAuth mAuth;
    private FirebaseFirestore db;
    private static String userName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        generateUserName();

        try {
            sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        mAuth = FirebaseAuth.getInstance();
        FirebaseUser user = mAuth.getCurrentUser();

        if(user!=null){
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            Toast.makeText(this, userName, Toast.LENGTH_SHORT).show();
            intent.putExtra("name", userName);
            startActivity(intent);
            finish();
        }else{
            setContentView(R.layout.activity_splash);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    Intent intent = new Intent(SplashActivity.this, LoginActivity.class);
                    startActivity(intent);
                    finish();
                }
            }, SPLASH_DISPLAY_LENGTH);
        }
    }

    private void generateUserName(){
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        db = FirebaseFirestore.getInstance();
        db.collection("users").document(user.getEmail())
                .get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                userName = task.getResult().get("name").toString();
            }
        });
    }

}

Это действие SplashActivity.Таким образом, приложение пропустит это действие, когда пользователь уже вошел в систему.но странная вещь происходит в этом коде.переменная userName получает данные имени пользователя в FireStore.но когда я запускаю приложение в первый раз, оно пустое.но затем после нажатия кнопки BackButton на моем телефоне приложение показывает MainActivity и имя не является нулевым.это очень страннои я не понимаю, почему это так.

Я не знаю, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Если имя пользователя из базы данных совпадает с именем пользователя в объекте FirebaseUser, вы можете просто получить имя пользователя, используя следующую строку odf-кода:

String userName = user.getDisplayName();

КакВы можете видеть, что нет необходимости делать дополнительный вызов в базу данных, чтобы получить имя пользователя.Это также означает, что на одну операцию чтения меньше.

0 голосов
/ 07 октября 2018

Когда вы перечитываете свой код, он не станет странным, но ожидается.Вы не получите userName до тех пор, пока generateUserName не завершит выполнение следующего кода:

private void generateUserName(){
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    db = FirebaseFirestore.getInstance();
    db.collection("users").document(user.getEmail())
            .get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            userName = task.getResult().get("name").toString();
        }
    });
}

Вы можете видеть, что вы ждете userName внутри OnCompleteListener, который работает асинхронно .

Итак, вам нужно выполнить другой код после того, как у вас будет значение userName.Как то так:

private void generateUserName(){
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    db = FirebaseFirestore.getInstance();
    db.collection("users").document(user.getEmail())
            .get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            userName = task.getResult().get("name").toString();
            doSomethingAfterFoundUserName(userName);                   
        }
    });
}

private void doSomethingAfterFoundUserName(String userName) {
  // Get current user
  // check for current user
  // etc.. 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...