【问题标题】:How to check whether a user is email verified or not through a listener?如何通过侦听器检查用户是否通过电子邮件验证?
【发布时间】:2018-08-01 12:22:28
【问题描述】:

我有一个活动EmailSignUpActivity,它有两个按钮,一个用于创建用户,另一个用于验证电子邮件。创建用户后,用户将按下验证电子邮件按钮,将验证电子邮件发送到注册的电子邮件。

我在这里所做的是将用户保持在 EmailSignUpActivity 直到他验证电子邮件,然后将他发送到 MainActivity。为此,我使用以下代码:

//  sending email verification
    emailVerificationButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressDialog1.show();

            if(mAuth.getCurrentUser() != null) {

                if (emailEditText.length() != 0 && passwordEditText.length() != 0 && reEnterPasswordEditText.length() != 0) {
                        mAuth.getCurrentUser().sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                progressDialog1.dismiss();

                                Log.d(TAG, "onSuccess: email sent");

                                Toast.makeText(EmailSignUpActivity.this, "Email verification sent", Toast.LENGTH_SHORT).show();

                                /**
                                 * Making the app unresponsive
                                 */
                                while(!mAuth.getCurrentUser().isEmailVerified()){
                                    mAuth.getCurrentUser().reload();
                                }

                                if(mAuth.getCurrentUser().isEmailVerified()){
                                    Toast.makeText(EmailSignUpActivity.this, "Email verified", Toast.LENGTH_SHORT).show();
                                    Intent intent = new Intent(EmailSignUpActivity.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                }
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressDialog1.dismiss();

                                Log.w(TAG, "onFailure: Email verification failed ==> ", e);
                            }
                        });
                    }else{
                    Toast.makeText(EmailSignUpActivity.this, "Fill out the details", Toast.LENGTH_SHORT).show();
                }
            }else{
                Toast.makeText(EmailSignUpActivity.this, "Create a user first!", Toast.LENGTH_SHORT).show();
            }
            }
        });

上面的代码在文档 cmets 之后有一个 while 循环,它将无限运行直到验证电子邮件,但这会使应用程序无响应,例如:

我尝试在 AuthStateListener 的帮助下实现相同的目标,但失败了,因为 AuthStateListener 只会在用户创建时触发, 登录退出

authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

            Log.d(TAG, "onAuthStateChanged: method called");

            if(firebaseAuth.getCurrentUser() != null)
                isEmailVerified = firebaseAuth.getCurrentUser().isEmailVerified();

            if(isEmailVerified){
                Toast.makeText(EmailSignUpActivity.this, "Email verified", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(EmailSignUpActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }
    };

    mAuth.addAuthStateListener(authStateListener);

我在这里想要的是通过监听器或任何不应该使应用无响应的等效物来收听 isEmailVerified()。我怎样才能做到这一点?

【问题讨论】:

  • 如果您使用主线程(UI 线程)进行长时间运行的操作,您的应用程序将变得无响应。在单独的线程上执行此操作
  • while(!mAuth.getCurrentUser().isEmailVerified()){ mAuth.getCurrentUser().reload(); } ??为什么循环网络请求?如果您检查isEmailVerified() 的某些操作(例如单击按钮)会更好。如果 Firebase 没有为其提供侦听器,请在 action 上执行。不要循环请求。这将是一场灾难。
  • @ADM 我想为此添加一个按钮,但这不会与 UI 一起使用。还有什么我可以做的吗?
  • 我对@9​​87654327@不太熟悉,但是如果没有直接监听这个事件,那么你应该尝试我建议的方式。
  • @SaranSankaran 你的建议很适合 UI,我已经使用了。谢谢你的帮助。

标签: android firebase firebase-authentication


【解决方案1】:

正如您所发现的,使用所谓的紧密无限循环会阻止您的应用响应其他用户输入。所以我们很容易同意这是一个坏主意。如果在 Firebase 文档中建议您这样做,您能给我一个指向该文档特定部分的链接吗?

您需要找到另一个事件来回复,以验证用户是否已验证其电子邮件地址。常见的选项有:

  1. 为用户提供一个 UI 元素,表明他们已经验证了他们的电子邮件地址。在您的情况下这可能是不可能的,但这是我所知道的最常见的方法。
  2. 检查电子邮件地址是否在启动时或您的主要活动显示时得到验证。这通常会进入您的登录流程:登录用户,检查他们的电子邮件地址是否经过验证。如果是这样,你让他们进入应用程序。如果没有,您可以让他们选择(重新)发送验证电子邮件。鉴于用户需要切换到他们的邮件应用程序才能获得验证电子邮件,他们已经切换出(并因此返回)您的应用程序。
  3. 在验证电子邮件中指定所谓的continue URL。如果您使用此选项发送 Firebase 动态链接,您可以在用户点击电子邮件中的验证链接后自动让他们回到您上次离开的应用程序(只要他们在同一移动设备上这样做)。
  4. 定期检查。这与您现在所做的最相似,但没有 tight 循环。有关此问题的一些选项,请参阅此问题:How to run a method every X seconds

【讨论】:

  • 不,任何 Firebase 文档都没有建议使用紧密循环。谢谢您的回复。
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多