Java 为什么我们必须多次调用getCurrentUser()?
我正在创建一个日志应用程序 我目前正在开发用户是否已登录的功能,绕过“入门/登录活动” 在我正在观看的创建日记应用程序的视频中,讲师呼叫Java 为什么我们必须多次调用getCurrentUser()?,java,android,firebase,google-cloud-firestore,firebase-authentication,Java,Android,Firebase,Google Cloud Firestore,Firebase Authentication,我正在创建一个日志应用程序 我目前正在开发用户是否已登录的功能,绕过“入门/登录活动” 在我正在观看的创建日记应用程序的视频中,讲师呼叫 mUser=firebaseAuth.getCurrentUser()多次 他在onStart()、在onCreate()和onAuthStateChanged()中调用它。我可以理解为什么我们可能需要在onAuthStateChanged()中再次调用它,但在这种情况下,我只是检查用户是否已经登录,因此它不应该从onCreate()中接收的用户更改 我从on
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);
}
}
}
public类MainActivity扩展了AppCompatActivity{
按钮启动;
私人FirebaseUser mUser;
私有FirebaseAuth FirebaseAuth;
私有FirebaseAuth.AuthStateListener myListener;
私有FirebaseFirestore db=FirebaseFirestore.getInstance();
私有集合引用myCollectionRef=db.collection(“用户”);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
firebaseAuth=firebaseAuth.getInstance();
mUser=firebaseAuth.getCurrentUser();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getStarted=findViewById(R.id.btnGetStarted);
getStarted.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
startActivity(新意图(MainActivity.this、LoginActivity.class));
完成();
}
});
myListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共无效(@NonNull@NotNull FirebaseAuth FirebaseAuth){
if(mUser!=null){
//登录
//我评论了这一点,一切仍然运作良好
//mUser=firebaseAuth.getCurrentUser();
字符串currentUserId=mUser.getUid();
myCollectionRef.whereEqualTo(“userId”,currentUserId).addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable@org.jetbrains.annotations.Nullable QuerySnapshot value,@Nullable@org.jetbrains.annotations.Nullable FirebaseFirestoreException错误){
if(错误!=null){
Log.d(“我的错误”,error.toString());
}
如果(!value.isEmpty()){
for(QueryDocumentSnapshot快照:值){
JournalApi myJournalApi=新JournalApi();
myJournalApi.setUsername(snapshot.getString(“用户名”);
myJournalApi.setId(snapshot.getString(“userId”);
startActivity(新意图(MainActivity.this,JournalList.class));
完成();
}
}
}
});
}否则{
//未登录
}
}
};
}
@凌驾
受保护的void onStart(){
super.onStart();
//我评论了这一点,一切仍然运作良好
//mUser=firebaseAuth.getCurrentUser();
firebaseAuth.addAuthStateListener(myListener);
}
@凌驾
受保护的void onPause(){
super.onPause();
如果(firebaseAuth!=null){
firebaseAuth.removeAuthStateListener(myListener);
}
}
}
您每次要检查用户当前会话时都必须调用此方法,因为用户的会话可以从其他服务或方法更改,如果您不调用此方法并且只调用一次,您将无法获得最新的用户配置文件信息、身份验证会话等。登录是一个活动过程,通过使用
方法调用其中一个
登录、维护身份验证状态并在应用程序重新启动时恢复身份验证状态来触发代码,这些都是在使用Firebase SDK时自动发生的后台过程。这很好,因为这意味着您不必编写代码来保持令牌有效,也不必检查用户配置文件是否已更改或其帐户是否已被禁用
但是,这确实意味着您无法在变量中可靠地缓存firebaseAuth.getCurrentUser()
的值很长时间。如果将该值保留在变量中,然后SDK在后台更新身份验证状态,则代码可能不再查看firebaseAuth.getCurrentUser()
的正确值
这就是为什么您会看到对
firebaseAuth.getCurrentUser()
的调用比您预期的要多的原因,也是为什么您会看到firebaseAuth.addAuthStateListener
在身份验证状态更改时,例如当用户通过SDK登录或注销时,希望收到通知的地方。谢谢您的回答!为什么需要在onCreate()和onStart()中获取当前用户?我们不能在onAuthStateChanged()中检查当前用户(它将包括所有进程,如登录、注销等)吗?谢谢。是的,一般来说,除了初始值之外,我更喜欢使用auth状态侦听器。因为您的代码必须有一些默认值,所以我倾向于使用getCurr