2016-06-07 2 views
24

Я начал работать с новым Firebase SDK.Firebase Android onAuthStateChanged называется дважды

Когда я выполняю вход пользователя в систему, метод onAuthStateChanged вызывается дважды с тем же состоянием (и т. Д. Пользовательский вход).

Я уверен, что добавляю AuthStateListener только один раз к ссылке FirebaseAuth.

Любая помощь?

+0

где ваш код? –

+0

Эта проблема существует и в моем коде. 'OnStart()' имеет только этот код, кроме вызова super: 'FirebaseAuth.getInstance(). AddAuthStateListener (this);'. Этот вызов больше не встречается, и я проверил, что 'onStart()' вызывается только один раз. Тем не менее метод 'onAuthStateChanged (...)' вызывается дважды (или три раза иногда). –

+1

Вероятно, ошибка, используйте флаг тем временем, как в этом ответе: http://stackoverflow.com/a/37686371/3597165 – user3597165

ответ

29

Да, и это очень раздражает. Это связано с регистрационным звонком. Мало того, onAuthStateChanged будет многократно вызываться во многих разных состояниях, не имея возможности узнать, в каком состоянии он находится.

Documentation говорит:

onAuthStateChanged (FirebaseAuth авт)

Этот метод вызывается, в потоке пользовательского интерфейса об изменениях в состоянии аутентификации:

  • Сразу после слушатель зарегистрировано

  • Когда пользователь подписывается в

  • Если текущий пользователь выписался
  • Если текущий пользователь изменяет
  • Когда происходит изменение в текущего пользователя лексема

Вот некоторые советы по обнаружению текущего состояния:

  • Регистрационный звонок: пропустите первый звонок с флагом.
  • Пользователь присоединился: пользователь от параметра is! = Null.
  • Пользователь выйдет из системы: пользователь из параметра == null.
  • Текущие изменения пользователя: пользователь из параметра is! = Нулевой и последний идентификатор пользователя: = идентификатор пользователя из параметра
  • Обновление токена пользователя: пользователь из параметра is! = Null, а последний идентификатор пользователя - это идентификатор пользователя из параметра

Этот слушатель - это беспорядок и очень жуткий. Команда Firebase должна изучить ее.

2

Моим обходным путем является использование логического имени, объявленного глобально для флага, если раньше требовалось называтьAuthStateChanged.

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; 
       } 
      } 
     } 
    }; 
+0

Спасибо просто, но выполняет работу, когда вы не хотите тратить больше времени. –

Смежные вопросы