Попытка перезапустить CountDownTimer через 15 секунд.

Я делаю приложение, которое отображает различные позы йоги в течение 60 секунд. Я рвал на себе волосы, пытаясь заставить таймер обратного отсчета работать так, как я хочу. Мне нужно, чтобы таймер мог приостанавливаться и автоматически перезапускаться через 15 секунд. CountDownTimer из Android не работал, потому что у него не было паузы. Я попробовал 2 разные версии переписанных Android CountDownTimers и классическую версию (Android CountDownTimer), и все они, похоже, имеют одну и ту же ошибку, потому что они используют обработчики.

Я пробовал эту версию: http://www.java2s.com/Open-Source/Android/Timer/multitimer-android/com/cycleindex/multitimer/CountDownTimerWithPause.java.htm

Я пробовал эту версию: Android: CountDownTimer пропускает последний onTick()! — я добавил к нему метод onFinish.

Я пытаюсь выполнить Thread.sleep в методе onFinish в течение 15 секунд, и он не обновляет пользовательский интерфейс за последнюю секунду перед переходом в режим Thread.sleep. В следующем коде TextView не обновляется, чтобы установить пустую строку, пока не будет выполнен вызов Thread.sleep.

cdt = new CountDownTimerWithPause(60000,1000,true) { 
        @Override
        public void onTick(long millisUntiFinished) { 
            tvClock.setText("Remaining:" + millisUntiFinished/1000);

        }

        @Override
        public void onFinish() {
            tvClock.setText("");
            bell.start();
            if (bAutoPlayIsOn) { 

                tvClock.setText("waiting for next pose...");
                try {

                    //15 second pauses between poses
                    Thread.sleep(15000);
                    //start over
                    listener.onForwardItemSelected();
                    ResetClocktoMaxTime(60000);
                    resume();
                } catch (InterruptedException e) {
                    Log.d("Sleep Interrupted", e.toString());
                    e.printStackTrace();
                }
                catch (Exception e) {
                    Log.d("Timer", e.toString());
                }
            }
            else { 
              tvClock.setText("Done");
                       btnStart.setText("Start ");
              bClockIsTicking = false;
              btnStart.setCompoundDrawablesWithIntrinsicBounds(null, playBtn, null, null);
            }

        }
    };

У кого-нибудь есть идеи, как это сделать (перезапустить через 15 секунд) по-другому?


person Kristy Welsh    schedule 24.01.2013    source источник
comment
Ха, я поставил массы в тупик. :(   -  person Kristy Welsh    schedule 25.01.2013


Ответы (1)


Метод onFinish вызывается из потока интерфейса, поэтому любые изменения интерфейса, которые вы вносите, не будут фактически перерисовываться до тех пор, пока onFinish не вернется. Попробуйте что-то вроде этого:

  cdt = new CountDownTimerWithPause(60000,1000,true) {
      @Override
      public void onTick(long millisUntiFinished) {
          tvClock.setText("Remaining:" + millisUntiFinished/1000);

      }

      @Override
      public void onFinish() {
          tvClock.setText("");
          bell.start();
          if (bAutoPlayIsOn) {

              tvClock.setText("waiting for next pose...");
              (
                new Thread() {
                    public void run() {
                        try {
                            //15 second pauses between poses
                            Thread.sleep(15000);
                            getActivity().runOnUiThread
                            (
                              new Runnable() {
                                  public void run() {
                                    //start over
                                    listener.onForwardItemSelected();
                                    ResetClocktoMaxTime(60000);
                                    resume();
                                  }
                              }
                            );
                        }
                        catch (InterruptedException e) {
                            Log.d("Sleep Interrupted", e.toString());
                            e.printStackTrace();
                        }
                        catch (Exception e) {
                            Log.d("Timer", e.toString());
                        }
                    }
                }

              ).start();

          }
          else {
            tvClock.setText("Done");
            btnStart.setText("Start ");
            bClockIsTicking = false;
            btnStart.setCompoundDrawablesWithIntrinsicBounds(null, playBtn, null, null);
          }

      }
  };   
person Jon Vance    schedule 25.01.2013