У меня есть пользователь, создающий игровую комнату в firebase.Если другой пользователь присоединится к игре, все в порядке.Моя проблема в том, что «создатель» может выйти из приложения, закрыть приложение или не находится в игре, когда присоединяется другой пользователь.Так что я хочу, чтобы в этом случае игровая комната была удалена из базы.Я делаю это с помощью следующего кода:
public void removeGameFromWaitQueue() {
DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
if (mCurrentGame.getState() == DatabaseModels.Game.State.JOINED.ordinal()){
//do nothing
}
else
data.removeValue();
}
Моя проблема в том, что когда я добавляю код в onStop () и onDestroy (), игра, конечно, удаляется, но даже если присоединяется другой игрокигра и переход к игровой активности собственно вызывается onStop () и onDestroy, поэтому игра снова удаляется.Есть ли другой способ удалить игру, если создатель завершил действие, но не если приложение перейдет к следующему действию?
РЕДАКТИРОВАТЬ
Я немного изменил код, например:
public void removeGameFromWaitQueue() {
final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
data.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
data.removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Таким образом, когда состояние mCurrentGame открыто, я могу удалить игру.Проблема сейчас в том, что if (snapshot.exists ()) не работает, так как я получаю Null Exception после запуска игры.Что-то не так с кодом?То есть снимок проверяет mCurrentGame или я не прав?
ОБНОВЛЕНИЕ
Мне удается заставить код работать так, как мне нужно, вот так:
@Override
protected void onStop() {
super.onStop();
if(mCurrentGame!=null) {
removeGameFromWaitQueue();
}
// un-subscribe the listeners
if (mCreatedGamesListener != null) {
mGamesDatabaseRef.removeEventListener(mCreatedGamesListener);
}
if (mJoinedGamesListener != null) {
mGamesDatabaseRef.removeEventListener(mJoinedGamesListener);
}
}
public void removeGameFromWaitQueue() {
final DatabaseReference data = FirebaseDatabase.getInstance().getReference().child("games").child(mCurrentGameKey);
data.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
mCurrentGame = snapshot.getValue(DatabaseModels.Game.class);
if (mCurrentGame.getState() == DatabaseModels.Game.State.OPEN.ordinal()){
data.removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Трудно предсказать каждый«ненормальное» поведение пользователя, поэтому теперь моя проблема в том, что мне нужно ВСЕ это в проверке IF, что ВСЕ данные DatabaseReference существуют.Как и во многих случаях вызывается onStop (), если мой пользователь входит в действие, но он НЕ создает игру, то DatabaseRerence будет пустым.Таким образом, вызов данных вызывает исключение.Так, как я могу проверить, существует ли DatabaseReference ИЛИ, если он был создан?