我正在创建一个日记应用程序。
我目前正在开发用户已登录的功能 - 绕过“开始/登录 Activity ”
在我正在观看的创建日记应用程序的视频中,讲师调用
mUser = firebaseAuth.getCurrentUser();
多次。
他在 onStart()
、onCreate()
和 onAuthStateChanged()
中调用它。我可以理解为什么我们可能需要在 onAuthStateChanged()
中再次调用它,但在这种情况下,我只是检查用户是否已经登录,所以它不应该从用户那里更改在 onCreate()
我从 onAuthStateChanged()
和 onStart()
中删除了它,一切仍然工作正常。但是,我不确定这是否会导致我将来犯错误。如果有人能证实这一点,我将不胜感激。
我们需要多次调用 getCurrentUser()
是否有原因?
谢谢。
这是我的完整代码供引用:
public class MainActivity extends AppCompatActivity {
Button getStarted;
private FirebaseUser mUser;
private FirebaseAuth firebaseAuth;
private FirebaseAuth.AuthStateListener myListener;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private CollectionReference myCollectionRef = db.collection("Users");
@Override
protected void onCreate(Bundle savedInstanceState) {
firebaseAuth = FirebaseAuth.getInstance();
mUser = firebaseAuth.getCurrentUser();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getStarted = findViewById(R.id.btnGetStarted);
getStarted.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, LoginActivity.class));
finish();
}
});
myListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull @NotNull FirebaseAuth firebaseAuth) {
if(mUser != null){
//logged in
//I commented this out and everything is still working fine
//mUser = firebaseAuth.getCurrentUser();
String currentUserId = mUser.getUid();
myCollectionRef.whereEqualTo("userId", currentUserId).addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable @org.jetbrains.annotations.Nullable QuerySnapshot value, @Nullable @org.jetbrains.annotations.Nullable FirebaseFirestoreException error) {
if(error != null){
Log.d("my_error", error.toString());
}
if(!value.isEmpty()){
for(QueryDocumentSnapshot snapshot : value){
JournalApi myJournalApi = new JournalApi();
myJournalApi.setUsername(snapshot.getString("username"));
myJournalApi.setId(snapshot.getString("userId"));
startActivity(new Intent(MainActivity.this, JournalList.class));
finish();
}
}
}
});
}else{
//not logged in
}
}
};
}
@Override
protected void onStart() {
super.onStart();
//I commented this out and everything is still working fine
//mUser = firebaseAuth.getCurrentUser();
firebaseAuth.addAuthStateListener(myListener);
}
@Override
protected void onPause() {
super.onPause();
if(firebaseAuth != null){
firebaseAuth.removeAuthStateListener(myListener);
}
}
}
最佳答案
虽然登录是一个 Activity 过程,但您的代码会通过调用 signInWith
方法之一来触发,维护身份验证状态并在应用程序重新启动时恢复身份验证状态是您使用Firebase SDK。这很棒,因为这意味着您不必编写代码来保持 token 有效,或检查用户个人资料是否已更改或其帐户是否已被禁用。
但这确实意味着您无法在变量中可靠地缓存 firebaseAuth.getCurrentUser()
的值很长时间。如果您将该值保留在变量中,然后 SDK 在后台更新身份验证状态,您的代码可能不再查看 firebaseAuth.getCurrentUser()
的正确值。
这就是为什么您会看到对 firebaseAuth.getCurrentUser()
的调用比您预期的要多,也是为什么您会在需要的地方看到 firebaseAuth.addAuthStateListener
当身份验证状态发生变化时收到通知,例如当用户通过 SDK 登录或注销时。
关于java - 为什么我们必须多次调用 Firebase getCurrentUser() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67494950/