В моем классе много слушателей событий, и раньше я спрашивал, как убить этих слушателей после того, как они произошли один раз, и я решил эту проблему.
В некоторых случаях это работает, но вдругие у меня проблемы.Так, например, у меня есть этот метод, который имеет прослушиватель событий.
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();
}