使ValueListener仅发生一次

时间:2018-12-08 18:26:45

标签: java android firebase firebase-realtime-database

我想知道是否可以使值事件侦听器中的代码仅发生一次。

我有一个值侦听器,该侦听器检查游戏中的2位玩家是否单击了ready按钮。如果有,那么监听器中的代码就会发生,这很好,但是我只希望它发生一次。

问题在于,因为侦听器中的条件为真,所以代码会一遍又一遍地执行。这是侦听器的简化版本

   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");
                    }
                }
            });
因此,一旦if语句中的条件为true,if语句中的代码就会反复触发。我知道发生这种情况是因为我在该语句中放入了一条log语句,并且该语句继续打印在日志中。

我该如何进行设置,以使此代码仅触发一次,直到提示再次触发?我知道一种方法是在代码发生后立即将if语句中的条件设置为false,但这会带来问题,因为我需要该值才能使true才能使代码中的其他方法正常工作

1 个答案:

答案 0 :(得分:2)

只需在调用后将其删除:

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);

每当您希望它工作时。