Как запустить задачу каждую секунду в течение 10 секунд.
У меня есть следующий код, который запускает задачу каждую секунду, но я также хочу остановить задачу через 10 секунд. Можно ли реализовать эту логику с помощью обработчика, в котором я использую? Я попытался реализовать счетчик с циклом while, но не смог заставить его работать
mHandler = new Handler();
mUpdateUI = new Runnable() {
public void run() {
mVistaInspectionDate = HousingFragment.getVistaInspectionDate();
mVistaInspectionDateTextView.setText(mVistaInspectionDate);
if (mVistaInspectionDate != null) {
mHandler.removeCallbacks(mUpdateUI);
}
mHandler.postDelayed(mUpdateUI, 1000); // 1 second
}
};
mHandler.post(mUpdateUI);
4 ответа
Чтобы использовать счетчик, вы можете обернуть его в функцию, подобную этой:
private void postDelayedWrapped(final int counter, int delay) {
if (counter <= 0) return;
mUpdateUI = new Runnable() {
public void run() {
mVistaInspectionDate = HousingFragment.getVistaInspectionDate();
mVistaInspectionDateTextView.setText(mVistaInspectionDate);
if (mVistaInspectionDate != null) {
mHandler.removeCallbacks(mUpdateUI); //necessary?
}
postDelayedWrapped(counter - 1, 1000);
}
};
mHandler.postDelayed(mUpdateUI, delay);
}
И вы начинаете это так:
mHandler = new Handler();
postDelayedWrapped(10,0);
Используйте цикл While с логической переменной и установите для этой переменной значение true, тогда вы можете подсчитать, сколько раз ваша задача выполнялась, и останавливать ее на 1 секунду после каждого запуска, но может случиться, что задержка на 1 секунду не будет равна одной секунде. из-за планирования потока.
Таким образом, вы можете использовать время для подсчета и остановки цикла while. Сохраните ваше текущее время, и каждую 1 секунду ваша задача будет выполнена. Через 10 раз поток завершается, либо прерывая поток в цикле while, либо устанавливая логическую переменную в значение false.
Как насчет создания подкласса класса Handler и использования экземпляра этого класса для отслеживания того, сколько раз была вызвана функция postDelayed()?
public class MyHandler extends Handler {
private int maxTimes;
private int currentTimes;
private Runnable runner;
public Handler(int maxTimes) {
this.maxTimes = maxTimes;
}
@Override
public void post(Runnable runner) {
this.runner = runner;
}
@Override
public void postDelayed(Runnable runner,long ms) {
if (currentTimes == maxTimes) {
this.removeCallbacks(runner);
} else {
super.postDelayed(runner,ms);
currentTimes++;
}
}
}
mHandler = new MyHandler(10);//using subclass instance
//from here on is the same as the original code.
mUpdateUI = new Runnable() {
public void run() {
mVistaInspectionDate = HousingFragment.getVistaInspectionDate();
mVistaInspectionDateTextView.setText(mVistaInspectionDate);
if (mVistaInspectionDate != null) {
mHandler.removeCallbacks(mUpdateUI);
}
mHandler.postDelayed(mUpdateUI, 1000); // 1 second
}
};
mHandler.post(mUpdateUI);