当我第一次启动应用程序时,用户名为null

问题描述 投票:1回答:2
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并且名称不为null。这很奇怪。我不明白为什么会这样。

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

java android google-cloud-firestore
2个回答
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。

因此,您需要在拥有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.. 
}

0
投票

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

String userName = user.getDisplayName();

如您所见,为了获取用户名,不需要额外调用数据库。这也意味着,少读取操作。

© www.soinside.com 2019 - 2024. All rights reserved.