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。
这很奇怪。而且我不明白为什么会这样。
我不知道如何解决这个问题。
答案 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();
如您所见,无需获取数据库的额外调用即可获取用户名。这也意味着减少了一次读取操作。