我有一个活动 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();
}
}
});
上面的代码在文档注释之后会循环播放一段时间,这些注释将无限运行直到电子邮件被验证,但这会使应用程序无响应,例如:
我尝试在 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(),这不应使应用程序无响应。我该如何实现?
答案 0 :(得分:1)
正如您所发现的那样,使用所谓的紧密无限循环将阻止您的应用响应其他用户输入。因此,我们很容易同意这是一个坏主意。如果在Firebase文档中建议您这样做,可以给我链接到该文档的特定部分吗?
您将需要找到另一个事件进行响应,以验证用户是否已验证其电子邮件地址。常用选项是: