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