Firebase Android onAuthStateChanged llamado dos veces
He empezado a trabajar con el nuevo SDK de Firebase.
Cuando estoy haciendo el inicio de sesión de usuario, estoy onAuthStateChanged método se llama dos veces con el mismo estado (etc usuario iniciar sesión).
- Cambio del nombre del paquete Firebase
- Android Firebase Auth - Obtener la foto del usuario
- Cómo actualizar Google Play Services a 9.8.7
- Firebase Manage Multiple auth provider
- Firebase Android Auth objeto sin devolución de llamada de disparo
Estoy seguro que estoy agregando el AuthStateListener solamente una vez a la referencia de FirebaseAuth.
¿Alguna ayuda?
- Firebase Android onAuthStateChanged () dispara dos veces después de signInWithEmailAndPassword ()
- Vaciar el campo de correo electrónico de Firebase Auth Usuario que utiliza Integración de inicio de sesión de Facebook (Firebase 3.0)
- Símbolo de autenticación no válido después de 1 hora - persistencia de disco en Firebase
- ¿Cómo enviar correo electrónico de verificación con Firebase?
- ¿Cómo enviar confirmación de correo electrónico de Firebase en la suscripción?
- Audífono de estado de firebase de Android firebase llamado varias veces
- Firebase en Android: ¿Cómo comprobar la razón Firebase auth falló?
- Firebase: Base de datos escribir antes de iniciar sesión
Sí, y esto es muy molesto. Esto se debe a una llamada de registro. No sólo eso, onAuthStateChanged va a ser llamado muchas veces en muchos estados diferentes, sin posibilidad de saber qué estado es.
La documentación dice:
OnAuthStateChanged (FirebaseAuth auth)
Este método se invoca en el subproceso de interfaz de usuario en los cambios en el estado de autenticación:
Justo después de que el oyente haya sido registrado
Cuando un usuario está conectado
- Cuando se cierra el usuario actual
- Cuando el usuario actual cambia
- Cuando hay un cambio en el token del usuario actual
Aquí algunos consejos para descubrir el estado actual:
- Llamada de registro: omita la primera llamada con un indicador.
- Usuario iniciado sesión: user from parameter is! = Null.
- Usuario cerrado: el usuario del parámetro es == nulo.
- El usuario actual cambia: el usuario del parámetro es! = Nulo y el último identificador de usuario es! = ID de usuario del parámetro
- Actualización de token de usuario: el usuario del parámetro es! = Nulo y el último identificador de usuario es == ID de usuario desde el parámetro
Este oyente es un desastre y muy bugprone. El equipo de Firebase debe examinarlo.
Mi solución es utilizar un Boolean declarado globalmente para marcar si onAuthStateChanged tiene necesidad de llamar antes.
private Boolean authFlag = false; mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) { if (firebaseAuth.getCurrentUser() != null) { if(authFlag== false) { // Task to perform once authFlag=true; } } } };