gpt4 book ai didi

android - Firebase Android onAuthStateChanged() 在 signInWithEmailAndPassword() 之后触发两次

转载 作者:IT老高 更新时间:2023-10-28 23:24:31 28 4
gpt4 key购买 nike

当我使用 signInWithEmailAndPassword() 登录时,onAuthStateChanged() 总是触发两次。

我很确定监听只添加了一次到 firebaseAuth,然后我在onStop()`中有代码可以移除监听器。

有人知道怎么解决吗?

我的代码:

public class SignInActivity extends BaseActivity implements
View.OnClickListener,
GoogleApiClient.OnConnectionFailedListener{

private static final String PREF_KEY_USER_EMAIL = "User_Email";
private static final int RC_SIGN_IN = 1111;

private FirebaseAuth firebaseAuth;
private FirebaseAuth.AuthStateListener authStateListener;
private DatabaseReference firebaseDbReference;

private TextView fieldEmail;
private TextView fieldPassword;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
getSupportActionBar().hide();

firebaseAuth = FirebaseAuth.getInstance();
firebaseDbReference = FirebaseDatabase.getInstance().getReference();
fieldEmail = (TextView) findViewById(R.id.field_email);
fieldPassword = (TextView) findViewById(R.id.field_password);

String userSavedEmail = getPreferences(MODE_PRIVATE).getString(PREF_KEY_USER_EMAIL, "");
if(userSavedEmail != null) {
fieldEmail.setText(userSavedEmail);
fieldPassword.requestFocus();
}

TextView linkForgotPassword;
Button buttonLogin;

linkForgotPassword = (TextView) findViewById(R.id.link_forgotPassword);
buttonLogin = (Button) findViewById(R.id.button_Login);
buttonSignUp = (Button) findViewById(R.id.button_signUp);

if (linkForgotPassword != null) {
linkForgotPassword.setOnClickListener(this);
}
if (buttonLogin != null) {
buttonLogin.setOnClickListener(this);
}
if (buttonSignUp != null) {
buttonSignUp.setOnClickListener(this);
}

authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(firebaseAuth.getCurrentUser() != null) {
onAuthSuccess(firebaseAuth.getCurrentUser());
}
}
};
}

@Override
protected void onStart() {
super.onStart();
firebaseAuth.addAuthStateListener(authStateListener);
}

@Override
protected void onStop() {
super.onStop();
if (authStateListener != null) {
firebaseAuth.removeAuthStateListener(authStateListener);
}
}

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.link_forgotPassword:
forgotPassword();
break;
case R.id.button_Login:
emailLogin();
break;
case R.id.button_signUp:
emailSignUp();
break;
}
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
}

private void forgotPassword(){
FirebaseAuth auth = FirebaseAuth.getInstance();
String emailAddress = fieldEmail.getText().toString();

if(TextUtils.isEmpty(emailAddress)){
Toast.makeText(SignInActivity.this, R.string.msg_EnterEmail,
Toast.LENGTH_SHORT).show();
}
else {
showProgressDialog();
auth.sendPasswordResetEmail(emailAddress)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
hideProgressDialog();
if (task.isSuccessful()) {
Toast.makeText(SignInActivity.this, R.string.msg_ResetPasswordEmailSent,
Toast.LENGTH_LONG).show();
}
}
});
}
}

private void emailLogin(){
if (!validateForm()) {
return;
}

showProgressDialog();
String email = fieldEmail.getText().toString();
String password = fieldPassword.getText().toString();

firebaseAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
hideProgressDialog();

if (!task.isSuccessful()) {
Toast.makeText(SignInActivity.this, R.string.msg_EmailLoginFailed,
Toast.LENGTH_SHORT).show();
}
else {
// Save the email
getPreferences(MODE_PRIVATE).edit()
.putString(PREF_KEY_USER_EMAIL, fieldEmail.getText().toString())
.apply();
}
}
});
}

private void emailSignUp(){
if (!validateForm()) {
return;
}

showProgressDialog();
String email = fieldEmail.getText().toString();
String password = fieldPassword.getText().toString();

firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
hideProgressDialog();

if (task.isSuccessful()) {
FirebaseUser user = task.getResult().getUser();
String displayName = displayNameFromEmail(user.getEmail());

// Update profile display name.
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName("Jane Q. User")
.build();
user.updateProfile(profileUpdates);
} else {
Toast.makeText(SignInActivity.this, R.string.msg_EmailSignUpFailed,
Toast.LENGTH_SHORT).show();
}
}
});
}

private void onAuthSuccess(FirebaseUser user) {
// Write new user
writeNewUser(user.getUid(),
user.getDisplayName(),
user.getEmail(),
user.getPhotoUrl());

// Go to MainActivity
startActivity(new Intent(this.getApplicationContext(), MainActivity.class));
finish();
}

private void writeNewUser(String userId, String displayName, String email, android.net.Uri photoUrl) {
User user = new User(displayName, email);

if(photoUrl != null){
user.setPhotoUrl(photoUrl.toString());
}

firebaseDbReference.child("users").child(userId).setValue(user);
}

private String displayNameFromEmail(String email) {
if (email.contains("@")) {
return email.split("@")[0];
} else {
return email;
}
}

private boolean validateForm() {
boolean result = true;
if (TextUtils.isEmpty(fieldEmail.getText().toString())) {
fieldEmail.setError("Required");
result = false;
} else {
fieldEmail.setError(null);
}

if (TextUtils.isEmpty(fieldPassword.getText().toString())) {
fieldPassword.setError("Required");
result = false;
} else {
fieldPassword.setError(null);
}

return result;
}
}

最佳答案

它确实触发了两次,我认为这是 Firebase 人员应该修复的错误(看着你 Frank 呵呵)。我认为你现在唯一能做的就是添加这样的标志。

private boolean flag = true;
...
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if(firebaseAuth.getCurrentUser() != null && flag) {
onAuthSuccess(firebaseAuth.getCurrentUser());
flag=false;
}
}
};

远非理想,但现在可以使用。代码仍然会触发两次,我们接受第一个并用我们的标志拒绝第二个,这样如果 Firebase 修复它并且突然监听器运行一次,我们的代码仍然有效。可能是为了让听者跑两遍,希望我们能从弗兰克的交叉帖中得到一些答案

关于android - Firebase Android onAuthStateChanged() 在 signInWithEmailAndPassword() 之后触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674823/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com