Проблема с запуском таймера после отмены одной итерации и запуска другой - PullRequest
0 голосов
/ 22 апреля 2011

Я застрял, пытаясь заставить свой таймер работать, где я сделаю один обратный отсчет, затем вернусь и сделаю другой.

Итак, при втором вызове timer.scheduleAtFixedRate я получаю IllegalStateException, но я отменяю TimerTask, а не Timer.

Что я хочу сделать, так это отсчитать двадцать секунд, затем десять секунд, а затем повторить, каждый раз обновляя текстовое поле, чтобы информировать пользователя о том, что ему следует делать.

Одна из проблем заключается в том, что обратный отсчет идет быстрее, чем раз в секунду.

04-22 01:34:57.118: DEBUG/TestHandler1(404): message called:2:null
04-22 01:34:57.709: DEBUG/TestHandler1(404): message called:3:null
04-22 01:34:57.899: DEBUG/TestHandler1(404): message called:4:null
04-22 01:34:58.198: DEBUG/TestHandler1(404): message called:5:null

Вот мое исключение:

04-22 01:35:48.529: ERROR/AndroidRuntime(404): java.lang.IllegalStateException: TimerTask is scheduled already
04-22 01:35:48.529: ERROR/AndroidRuntime(404):     at java.util.Timer.scheduleImpl(Timer.java:574)
04-22 01:35:48.529: ERROR/AndroidRuntime(404):     at java.util.Timer.scheduleAtFixedRate(Timer.java:530)

Вот код, который я использовал для этой попытки. Когда я пытался использовать разные таймерные задачи для каждого цикла, это было еще хуже, так как я поставил блок new TimerTask непосредственно перед timer.scheduleAtFixedRate, поэтому я вернулся к этой версии.

    handler = new Handler() {
        public void handleMessage(Message msg) {
            counterText.setText((new Date()).toString() + "  "
                    + Integer.toString(cntr));
            System.out.println("handleMessage");
        }
    };

    timertask = new TimerTask() {
        public void run() {
            handler.sendEmptyMessage(0);
            cntr++;
            if (cntr > maxReps) {
                timertask.cancel();
                cntr = 0;
            }
        }
    };
    doneButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
                cntr = 0;
                for (MyClass mclass : input.getLoop()) {
                    labelText.setText(mclass.getName());
                    for (int y = 0; y < 8; y++) {
                        maxReps = 20;
                        timer.scheduleAtFixedRate(timertask, 0, 1000);
                        maxReps = 10;
                        labelText.setText("Rest");
                        timer.scheduleAtFixedRate(timertask, 0, 1000);
                    }
                }
        }
    });

Надеюсь, кто-то может указать на простую ошибку, которую я сделал.

Выше приведен фрагмент моего кода из Activity, поэтому я включаю только то, что, по моему мнению, необходимо, чтобы показать, где у меня возникла проблема.

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Учитывая эту статью в руководстве разработчика: http://developer.android.com/resources/articles/timed-ui-updates.html и подобный пост здесь: http://cart.kolix.de/?p=1438, я бы предложил вам изменить стратегию и использовать handler.postDelayed(this, 2000);

НоЧто касается кода, я предполагаю, что он может быть отменен не той задачей.На самом деле я не понимаю смысла двух вызовов timer.scheduleAtFixedRate(timertask, 0, 1000); и установки сначала maxReps = 20;, а затем maxReps = 10; в одном и том же цикле, поскольку цикл не будет ждать завершения задачи перед продолжением.

Итак, вы отправляете как минимум 16 звонков на timer.scheduleAtFixedRate(), и не все могут быть отменены в нужное время.

0 голосов
/ 25 апреля 2011

После экспериментов с различными методами я, наконец, остановился на этом решении.

В моем методе OnCreate у меня был этот код, и он шел 20 секунд, а затем выход.* Часть моей трудности - не думать о том, как работает Android.Я нашел разные подходы, которые не сработали.

...