Android 如何通过侦听器检查用户是否通过电子邮件验证?
我有一个活动EmailSignUpActivity,它有两个按钮,一个用于创建用户,另一个用于验证电子邮件。创建用户后,用户将按下验证电子邮件按钮,向注册的电子邮件发送验证电子邮件 我在这里所做的是让用户保持EmailSignUpActivity,直到他验证电子邮件,然后将其发送到MainActivity。为了实现这一点,我使用以下代码:Android 如何通过侦听器检查用户是否通过电子邮件验证?,android,firebase,firebase-authentication,Android,Firebase,Firebase Authentication,我有一个活动EmailSignUpActivity,它有两个按钮,一个用于创建用户,另一个用于验证电子邮件。创建用户后,用户将按下验证电子邮件按钮,向注册的电子邮件发送验证电子邮件 我在这里所做的是让用户保持EmailSignUpActivity,直到他验证电子邮件,然后将其发送到MainActivity。为了实现这一点,我使用以下代码: // sending email verification emailVerificationButton.setOnClickListener(n
// 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();
}
}
});
我想在这里通过一个监听器或任何类似的监听器来收听isEmailVerified(),而这些监听器不应该使应用程序无响应。如何实现这一点?正如您所发现的,使用所谓的紧密无限循环将阻止您的应用程序响应其他用户输入。所以我们很容易同意这是个坏主意。如果有人建议您在Firebase文档中这样做,您能给我一个特定文档的链接吗 您需要找到另一个要响应的事件,以验证用户是否已验证其电子邮件地址。常见的选择有:
如果您使用主线程(UI线程)执行长时间运行的操作,您的应用程序将变得无响应。当(!mAuth.getCurrentUser().isEmailVerified()){mAuth.getCurrentUser().reload();}?,在单独的线程上执行此操作??为什么循环网络请求?如果您在某些操作(如单击按钮)上选中
isEmailVerified()
,效果会更好。如果Firebase没有为它提供侦听器,那么就立即执行。不要循环请求。这将是一场灾难。@ADM我曾想过为此添加一个按钮,但这不会与UI一起进行。还有什么我能做的吗?我对Firebase不太熟悉,但是如果没有直接的听众参加这个活动,那么你应该试试我建议的方式。@SaranSankaran你的建议与UI很好,我已经使用过了。谢谢,谢谢你的帮助。不,在任何Firebase文档中都没有提到过紧密循环。谢谢你的回复。
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);