我想知道是否可以使值事件侦听器中的代码仅发生一次。
我有一个值侦听器,该侦听器检查游戏中的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才能使代码中的其他方法正常工作
答案 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);
每当您希望它工作时。