Я использую Firebase
для мультиплеера. Все отлично работает, за исключением того, что мне нужно, когда один игрок закрывает приложение (onStop()
, onDestroy()
и т. Д.), Игра заканчивается. У меня есть следующая firebase
структура:
"PVP" : {
"active" : {
"1536394217496" : {
"didGameEnd" : true,
"gameMaster" : {
"didPlayerAnswer" : false,
"name" : "stelios",
"playerAnswerCorrect" : false,
"score" : 2
},
"gameSlave" : {
"didPlayerAnswer" : false,
"name" : "anna",
"playerAnswerCorrect" : false,
"score" : 4
},
У меня есть метод onDestroy
, onDestroy
и т. Д., Чтобы изменить "didGameEnd", работающий нормально. Моя проблема в том, что мне нужно поймать изменение, чтобы запустить код финальной игры. Я много пробовал, но не могу справиться. Вот мой код для этого:
mGameFirebase = FirebaseDatabase.getInstance()
.getReferenceFromUrl(Constants.FIREBASE_BASE_URL + Constants.FIREBASE_PVP + Constants.FIREBASE_GAME_ACTIVE_PATH + mGameWaitModel.getId());
public void ifGameEnds() {
mGameFirebase.child("didGameEnd").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Boolean isEnded = (Boolean) dataSnapshot.getValue();
if (isEnded == true) {
Intent intent = new Intent(getApplicationContext(), PvPWinningActivity.class);
Bundle dataSend = new Bundle();
dataSend.putString("Winning Text", winning_text);
dataSend.putInt("Your Score", your_Score);
dataSend.putInt("Opponent Score", opponent_score);
intent.putExtras(dataSend);
startActivity(intent);
finish();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Как я понимаю, valueListener
ловит datachange
, поэтому мне не нужно делать здесь что-то особенное. Я думаю, проблема в значении boolean
. Я попробовал это как строку без удачи.
Заданное значение работает нормально, поэтому, я думаю, я указываю в нужное место
mGameFirebase.child("didGameEnd").setValue(true);
Принесите любую помощь, если я новичок в Firebase!
После многих попыток следующий код
mGameFirebase.orderByChild("didGameEnd").equalTo(true).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// this will be triggered only when the value is true, so you can add the thing that you want to make happen, here only
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
работает, но срабатывает даже при значении ЛОЖЬ. Так что на самом деле это просто читать значение, а не делать то, что мне нужно.
следующий код
mGameEnd =FirebaseDatabase.getInstance()
.getReferenceFromUrl(Constants.FIREBASE_BASE_URL + Constants.FIREBASE_TEST_PATH + Constants.FIREBASE_GAME_ACTIVE_PATH + mGameWaitModel.getId());
mGameEnd.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean isEnded = dataSnapshot.getValue(Boolean.class);
if(isEnded) {
//Your logic
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
постоянно генерирует исключение Nullpoint.