Слушатель с одним значением происходит более одного раза - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть простая многопользовательская игра для моего приложения, и игра очень проста.Каждый игрок должен нажать «готово», после чего начинается игра.

Как только оба игрока готовы, для 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) {

        }
    });
}
            }
        });

Я думал, что установка его как слушателя события Единственного значения сделает его толькослучается однажды, но у меня есть логин, который, когда я запускаю игру, вызывается по циклу.

Как сделать так, чтобы это событие произошло один раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...