Зверніть увагу, що слід визначити 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
тому, що ви використовуєте" .