首次启动应用程序时,用户名为null

时间:2018-10-07 15:14:08

标签: java android google-cloud-firestore

unsafe.Pointers

此活动为SplashActivity。因此,当用户已经登录时,应用程序将跳过此活动。但是这段代码中发生了奇怪的事情。 变量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(); } }); } } 获取FireStore中用户的名称数据。 但是当我第一次启动应用程序时,它为空。 但在按下手机上的backButton之后,应用程序显示MainActivity,名称不为null。 这很奇怪。而且我不明白为什么会这样。

我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

当您重新阅读代码时,它不会变得很奇怪,但是可以预期。在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();
        }
    });
}

您可以看到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.. 
}

答案 1 :(得分:0)

如果数据库中的用户名与FirebaseUser对象中的用户名相同,则可以使用以下行odf代码简单地获取用户名:

String userName = user.getDisplayName();

如您所见,无需获取数据库的额外调用即可获取用户名。这也意味着减少了一次读取操作。