EventListener
обычно вызывается асинхронно.Ваше if
-класс, вероятно, обрабатывается до обратного вызова onDataChange
.
Найдите ниже предложение по решению вашей проблемы.
Сначала вам следуетпересмотреть саму переменную userOnlineBoolean
.Всегда полезно подумать о состояниях, которые переменная может иметь в течение своей жизни.В этом случае вы можете утверждать, что существует только два состояния: пользователь онлайн или нет.Если это так, вам следует избегать, чтобы эта переменная была undefined или null .Инициализируйте вашу переменную сразу, т. Е. При объявлении:
private boolean userOnlineBoolean = false;
Как видите, я использовал primitive boolean
вместо класса-оболочки Boolean
, чтобы убедиться, что он не может быть нулевым.
Теперь у вас есть много кода в методе onCreate()
.Я не знаю о контексте вашего приложения, но этот метод, вероятно, вызывается только один раз.Однако вы хотите, чтобы соответствующие части вашего пользовательского интерфейса обновлялись не только один раз, но, вероятно, каждый раз, когда ваша база данных изменяется.Таким образом, код должен входить в EventListener
или, что лучше, в отдельный метод, который вызывается из EventListener
.
Хорошо, вы можете удалить следующий код из метода onCreate ():
if(userOnlineBoolean){
userOnlineString = "Online";
}
lastSeenCustomBar.setText(userOnlineString);
и поместить его в новый метод, подобный этому.
private void updateUIOnDatabaseChange() {
userOnlineString = userOnlineBoolean ? "Online" : "";
lastSeenCustomBar.setText(userOnlineString);
}
Обратите внимание, что я рассмотрел случай, когда статус пользователя изменяется с онлайн на не онлайн .Вот почему я заменил предложение if
на троичный оператор (краткая форма для if-else).
И обновил ваш onDataChange
, а также
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userOnlineBoolean = dataSnapshot.getValue(Boolean.class);
updateUIOnDatabaseChange();
Log.e("lol ", ""+userOnlineBoolean);
}
Я думаю, что этоболее практичный и разумный дизайн.Дайте мне знать, если это работает для вас.