Обратите внимание, что нужно определить a Handlerи a Runnableв области видимости класса, чтобы он создавался один раз. removeCallbacks(Runnable)работает правильно, если не определить их несколько раз. Пожалуйста, посмотрите на следующие примеры для лучшего понимания:
Неверный путь:
public class FooActivity extends Activity {
private void handleSomething(){
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
doIt();
}
};
if(shouldIDoIt){
//doIt() works after 3 seconds.
handler.postDelayed(runnable, 3000);
} else {
handler.removeCallbacks(runnable);
}
}
public void onClick(View v){
handleSomething();
}
}
Если вы вызываете onClick(..)метод, вы никогда не прекращаете doIt()вызов метода до его вызова. Потому что каждый раз создает new Handlerи new Runnableэкземпляры. Таким образом, вы потеряли необходимые ссылки, которые принадлежат обработчикам и запускаемым экземплярам.
Правильный путь :
public class FooActivity extends Activity {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
doIt();
}
};
private void handleSomething(){
if(shouldIDoIt){
//doIt() works after 3 seconds.
handler.postDelayed(runnable, 3000);
} else {
handler.removeCallbacks(runnable);
}
}
public void onClick(View v){
handleSomething();
}
}
Таким образом, вы не потеряете реальные ссылки и removeCallbacks(runnable)успешно работаете.
Ключевое предложение заключается в том, что «определите их как глобальные в вашем Activityили в Fragmentтом, что вы используете» .