У меня есть простая многопользовательская игра для моего приложения, и игра очень проста.Каждый игрок должен нажать «готово», после чего начинается игра.
Как только оба игрока готовы, для gameStarted устанавливается значение true, и предполагается, что игровой процесс (который не контролируется игроками вообще) должен произойти.Это работает, но проблема в том, что это происходит более одного раза в цикле.Это прослушиватель события value, который у меня есть.
games.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
HomePage.getCurrentGameID(new HomePage.CallbackID() {
@Override
public void onSuccess(String currentGameID) {
if (dataSnapshot.child(currentGameID).child("player1").child("ready").getValue().equals(true)
&& dataSnapshot.child(currentGameID).child("player2").child("ready").getValue().equals(true)) {
counter.run();
}
if (dataSnapshot.child(currentGameID).child("gameStarted").getValue().equals(true) &&
dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(1)) {
headsOrTails.setText("Heads");
Log.i("FlipCoin", ";;happened");
flipHeads();
getResults();
endGame();
} else if (dataSnapshot.child(currentGameID).child("gameStarted").getValue().equals(true) &&
dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(2)) {
headsOrTails.setText("Tails");
Log.i("FlipCoin", ";;happened");
flipTails();
getResults();
endGame();
}
Вот мой метод getResults ().Я помещаю это здесь, чтобы показать, что у меня есть другой слушатель события значения, вызываемый из моего addListenerForSingleValueEvent
, который я показал выше
private void getResults() {
games.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
HomePage.getCurrentGameID(new HomePage.CallbackID() {
@Override
public void onSuccess(final String currentGameID) {
final String horT1 = dataSnapshot.child(currentGameID).child("player1").child("horT").getValue().toString();
final String horT2 = dataSnapshot.child(currentGameID).child("player2").child("horT").getValue().toString();
final double wager = Double.parseDouble(dataSnapshot.child(currentGameID).child("wager").getValue().toString());
HomePage.getUserPosition(new HomePage.CallbackPosition() {
@Override
public void onSuccess(int position) {
if(position == 1) {
if(horT1.equals("Heads") && dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(1)
|| horT1.equals("Tails") && dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(2)) {
getWinner(FirebaseAuth.getInstance().getUid(), wager);
} else {
getLoser(FirebaseAuth.getInstance().getUid(), wager);
}
}
if(position == 2) {
if(horT2.equals("Heads") && dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(1)
|| horT2.equals("Tails") && dataSnapshot.child(currentGameID).child("horT").getValue(Integer.class).equals(2)) {
getWinner(FirebaseAuth.getInstance().getUid(), wager);
} else {
getLoser(FirebaseAuth.getInstance().getUid(), wager);
}
}
if(dataSnapshot.child(currentGameID).child("gameFinished").getValue().equals(true)) {
//games.child(currentGameID).removeValue();
}
endGame();
}
});
}
});
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
});
Я думал, что установка его как слушателя события Единственного значения сделает его толькослучается однажды, но у меня есть логин, который, когда я запускаю игру, вызывается по циклу.
Как сделать так, чтобы это событие произошло один раз?