Обратите внимание, что нужно определить 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
том, что вы используете» .