java - 为什么我们必须多次调用 Firebase getCurrentUser() ?

标签 java android firebase google-cloud-firestore firebase-authentication

我正在创建一个日记应用程序。

我目前正在开发用户已登录的功能 - 绕过“开始/登录 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/

相关文章:

java - SoapUI 无法连接 HTTPS(SSLPeerUnverifiedException)

java - 如何使用文件对话框?

Android - 如何只初始化一次滑动菜单

java - Android图像淡入淡出动画

javascript - 如何在其功能之外使用父 key 请求的结果

java - 与主机获取ConnectionTimeoutException未在超时内接受连接

java - 通过子类定义变量

java - 如何在关闭应用程序之前停止纹理 View 监听器并显示图像

java - 单击下拉菜单中的项目后更改 RecyclerView 内容

ios - strip 创建用户 firebase 云函数