Прослушиватели событий слушают после удаления - PullRequest
0 голосов
/ 09 декабря 2018

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

В некоторых случаях это работает, но вдругие у меня проблемы.Так, например, у меня есть этот метод, который имеет прослушиватель событий.

    private void startGame() {
    HomePage.getCurrentGameID(new HomePage.CallbackID() {
        @Override
        public void onSuccess(final String currentGameID) {
            games.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.child(currentGameID).getValue().equals(1)) {
                        getResults();
                        Log.i("FlipCoin", "``startGame() happened");
                    } else {
                        return;
                    }
                    games.removeEventListener(this);
                }
}

У меня есть этот метод, который запускает игру, и в конце onDataChange() у меня есть games.removeEventListener(this).Но иногда, даже после того, как это выполнено, он все еще выполняет код, и я знаю это, потому что он регистрирует LogCat каждый раз, когда метод происходит.

В моем коде есть только один экземпляр, где я вызываю startGame()и этот экземпляр находится в этом таймере

private void runCounter() {
    final Runnable counter = new Runnable() {
        @Override
        public void run() {
                Log.i("FlipCoin", "``runCounter() happened");
                startGame();
            }
        }
    };
    counter.run();
}

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

В любом случае, как вы можете видеть в методе runCounter (), он вызывает startGame(), как и должно быть, и у меня также есть журнал в методе, который сообщает мне, когда вызывается этот метод runCoutner().

Странно то, что метод runCounter() регистрируется только один раз в logcat, как и должно быть, но он продолжает регистрировать startGame(), хотя я вызываю его только один раз в своем коде и удаляюслушатель в конце метода.

Почему это происходит, я очень запутался!


Runnable Я использую (не имеет отношения к вопросу)

private void runCounter() {
    final TextView headsOrTails = findViewById(R.id.HeadsOrTails);
    final Handler handler = new Handler();
    final AtomicInteger n = new AtomicInteger(3);
    final Runnable counter = new Runnable() {
        @Override
        public void run() {
            headsOrTails.setText("Flipping in: " + Integer.toString(n.get()) + " seconds");
            if (n.getAndDecrement() >= 1)
                handler.postDelayed(this, 1000);
            else {
                headsOrTails.setText("Flipping");
                Log.i("FlipCoin", "``runCounter() happened");
                startGame();
            }
        }
    };
    counter.run();
}

1 Ответ

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

Вы используете его неправильно.

Если вы хотите прослушать значение только один раз, а затем удалить слушателя, используйте: addListenerForSingleValueEvent

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