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。这很奇怪。我不明白为什么会这样。
我不知道如何解决这个问题。
当你重读你的代码时,它不会变得任何奇怪,但它是预期的。在你的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..
}
如果数据库中用户的名称与FirebaseUser
对象中的用户名相同,则只需使用以下行odf代码获取用户名:
String userName = user.getDisplayName();
如您所见,为了获取用户名,不需要额外调用数据库。这也意味着,少读取操作。