Java 当我第一次启动应用程序时,用户名为空 公共类SplashActivity扩展了AppCompatActivity{ 专用最终整数显示长度=1000; 私人消防队; 私有FirebaseFirestore数据库; 私有静态字符串用户名; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); generateUserName(); 试一试{ 睡眠(500); }捕捉(中断异常e){ e、 printStackTrace(); } mAuth=FirebaseAuth.getInstance(); FirebaseUser=mAuth.getCurrentUser(); 如果(用户!=null){ 意向意向=新意向(SplashActivity.this、MainActivity.class); Toast.makeText(这个,用户名,Toast.LENGTH_SHORT).show(); intent.putExtra(“名称”,用户名); 星触觉(意向); 完成(); }否则{ setContentView(R.layout.activity_splash); new Handler().postDelayed(new Runnable()){ @凌驾 公开募捐{ 意向意向=新意向(SplashActivity.this、LoginActivity.class); 星触觉(意向); 完成(); } },飞溅显示长度); } } 私有void generateUserName(){ FirebaseUser=FirebaseAuth.getInstance().getCurrentUser(); db=FirebaseFirestore.getInstance(); db.collection(“用户”).document(user.getEmail()) .get() .addOnCompleteListener(新的OnCompleteListener(){ @凌驾 未完成的公共void(@NonNull任务){ userName=task.getResult().get(“name”).toString(); } }); } }

Java 当我第一次启动应用程序时,用户名为空 公共类SplashActivity扩展了AppCompatActivity{ 专用最终整数显示长度=1000; 私人消防队; 私有FirebaseFirestore数据库; 私有静态字符串用户名; @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); generateUserName(); 试一试{ 睡眠(500); }捕捉(中断异常e){ e、 printStackTrace(); } mAuth=FirebaseAuth.getInstance(); FirebaseUser=mAuth.getCurrentUser(); 如果(用户!=null){ 意向意向=新意向(SplashActivity.this、MainActivity.class); Toast.makeText(这个,用户名,Toast.LENGTH_SHORT).show(); intent.putExtra(“名称”,用户名); 星触觉(意向); 完成(); }否则{ setContentView(R.layout.activity_splash); new Handler().postDelayed(new Runnable()){ @凌驾 公开募捐{ 意向意向=新意向(SplashActivity.this、LoginActivity.class); 星触觉(意向); 完成(); } },飞溅显示长度); } } 私有void generateUserName(){ FirebaseUser=FirebaseAuth.getInstance().getCurrentUser(); db=FirebaseFirestore.getInstance(); db.collection(“用户”).document(user.getEmail()) .get() .addOnCompleteListener(新的OnCompleteListener(){ @凌驾 未完成的公共void(@NonNull任务){ userName=task.getResult().get(“name”).toString(); } }); } },java,android,google-cloud-firestore,Java,Android,Google Cloud Firestore,这项活动是一项有趣的活动。因此,当用户已登录时,应用程序将跳过此活动。但这段代码中发生了奇怪的事情。 变量userName获取FireStore中用户的名称数据。 但当我第一次启动应用程序时,它是空的。 但按下手机上的Back按钮后,应用程序显示MainActivity,并且名称不为空。 这很奇怪。我不明白为什么会这样 我不知道如何解决这个问题。当你重新阅读你的代码时,它不会变得很奇怪,但这是意料之中的。在您的generateUserName完成执行以下代码之前,您无法获得用户名: public

这项活动是一项有趣的活动。因此,当用户已登录时,应用程序将跳过此活动。但这段代码中发生了奇怪的事情。 变量
userName
获取FireStore中用户的名称数据。 但当我第一次启动应用程序时,它是空的。 但按下手机上的Back按钮后,应用程序显示MainActivity,并且名称不为空。 这很奇怪。我不明白为什么会这样


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

当你重新阅读你的代码时,它不会变得很奇怪,但这是意料之中的。在您的
generateUserName
完成执行以下代码之前,您无法获得
用户名

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();
            }
        });
    }

}

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

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.. 
}
如您所见,为了获取用户名,不需要额外调用数据库。这也意味着,减少了一次读取操作

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.. 
}
String userName = user.getDisplayName();