事件侦听器在删除后进行侦听

时间:2018-12-08 23:25:55

标签: java android firebase firebase-realtime-database

我的课堂上有很多事件侦听器,并且早些时候我问过如何在这些侦听器发生一次后杀死它们,而我解决了这个问题。

在某些情况下它可以工作,但是在其他情况下,我遇到了问题。因此,例如,我有一个具有事件侦听器的方法。

    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(),即使我在代码中只调用了一次,也删除了方法末尾的侦听器。

为什么会这样,我非常困惑!


我正在使用可运行(与问题无关)

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 :(得分:0)

您使用错了。

如果您想只监听一次值,然后删除监听器,请使用:addListenerForSingleValueEvent