【发布时间】: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 一起使用。还有什么我可以做的吗?
-
我对@987654327@不太熟悉,但是如果没有直接监听这个事件,那么你应该尝试我建议的方式。
-
@SaranSankaran 你的建议很适合 UI,我已经使用了。谢谢你的帮助。
标签: android firebase firebase-authentication