Как запустить задачу каждую секунду в течение 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);

Попробуйте использовать класс Timer или Quartz scheduler, если вы можете иметь внешние зависимости, вместо того, чтобы кодировать логику планирования и потоков в своем собственном приложении.

Используйте цикл 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); 
Другие вопросы по тегам