Заставить ValueListener сделать только один раз - PullRequest
0 голосов
/ 08 декабря 2018

Мне интересно, можно ли сделать так, чтобы код в слушателе событий значения происходил только один раз.

У меня есть слушатель значений, который проверяет, нажали ли 2 игрока в игре *Кнопка 1003 *.Если это так, то произойдет код в слушателе, и это хорошо, но я хочу, чтобы это произошло только один раз.

Проблема в том, что условия в слушателе выполняются, код выполняется снова и снова инад.Это упрощенная версия прослушивателя

   games.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
            HomePage.getCurrentGameID(new HomePage.CallbackID() {
                @Override
                public void onSuccess(final String currentGameID) {
                    if(dataSnapshot.child(currentGameID.child("ready").getValue().equals(true)) {
                        runCounter();
                        Log.i("FlipCoin", "``ButtonClickListener happened");
                    }
                }
            });

SO, если условия в операторе if выполнены, код внутри оператора if запускается снова и снова.Я знаю, что это происходит, потому что я поместил оператор log в оператор, и он продолжает печатать в журнале.

Как я могу сделать так, чтобы этот код срабатывал только один раз, пока не будет предложено запустить снова?Я знаю, что один метод мог бы установить условие в операторе if на false сразу после выполнения кода, но это создает проблемы, так как мне нужно, чтобы значение читалось как true, чтобы другие методы в моем коде работали

1 Ответ

0 голосов
/ 08 декабря 2018

Просто удалите его после его вызова:

games.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {
        HomePage.getCurrentGameID(new HomePage.CallbackID() {
            @Override
            public void onSuccess(final String currentGameID) {
                if (dataSnapshot.child(currentGameID.child("ready").getValue().equals(true))) {
                runCounter();
                    Log.i("FlipCoin", "``ButtonClickListener happened");
                }
            }
        });

        games.removeEventListener(this); //remove it here
    }
});

Если вам нужно повторно использовать этот слушатель, присвойте его переменной:

ValueEventListener listener = new ValueEventListener() {
    //contents from above
}

Затем просто используйте:

games.addValueEventListener(listener);

всякий раз, когда вы хотите, чтобы это работало.

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