2012-02-19 4 views
0

У меня есть CountDownTimer, который нужно запускать все время. Есть 2 мероприятия (A и B). У Activity A есть CountDownTimer, который обновляет TextView внутри него. Когда я переключаюсь на B, CountDownTimer все еще работает (это желаемое поведение), но когда я переключаюсь обратно на A, кажется, что старый и новый A. Таймер не обновляет TextView внутри «нового», A. Он запускается только один раз, когда A сначала посещается. Любые идеи о том, как решить эту проблему? Может быть, поставить таймер в другое место?
Edit: Некоторый код:CountDownTimer работает в старой активности при переключении активности

private void prepareTimer() { 
    // TODO: DOES NOT WORK YET! (switching activities -> runs in old activity) 
    textTime = (TextView) findViewById(R.id.text_time); // is a field 

    if (!timerRunning) { 
     timerRunning = true; 

     int duration = 60000; 
     timer = new CountDownTimer(duration, 1000) { 

      public void onTick(long millisUntilFinished) { 
       long minsLeft = (long) Math.floor((double) millisUntilFinished/(double) Constants.ONE_MINUTE) + 1; 
       textTime.setText(minsLeft + " Min."); 
      } 

      public void onFinish() { 
       textTime.setText("done!"); 
      } 
     }; 
     timer.start(); 
    } 
} 
+0

Эй, вы должны узнать больше о своей деятельности жизненного цикла ... Когда возвращались из B в A Убедитесь, что вы питания в OnStart (...) метод. – Cehm

+0

Проводка некоторого кода может помочь –

ответ

0

CDT работает в своем собственном отдельном потоке. Ссылка TextView, к которой вы пытаетесь получить доступ, поскольку CDT больше не используется (поскольку ваша активность A больше не виден во время вашего пребывания в B) попробуйте создать новую ссылку, которая TextView, когда вы вернетесь к A. Нить CDT все еще работает независимо от того, вы переместились с A на B или наоборот. Я надеюсь, это поможет. Убедитесь, что вы вносили изменения в поток пользовательского интерфейса. ;)

Edit:

private void prepareTimer() { 
    // TODO: DOES NOT WORK YET! (switching activities -> runs in old activity) 
    textTime = (TextView) findViewById(R.id.text_time); // is a field 

    if (!timerRunning) { 
     timerRunning = true; 

     int duration = 60000; 
     timer = new CountDownTimer(duration, 1000) { 

      public void onTick(long millisUntilFinished) { 
       long minsLeft = (long) Math.floor((double) millisUntilFinished/(double) Constants.ONE_MINUTE) + 1; 
       textTime.setText(minsLeft + " Min."); 
      } 

      public void onFinish() { 
       textTime.setText("done!"); 
      } 
     }; 
     timer.start(); 
    } 
    else 
    { 
    textTime = (TextView) findViewById(R.id.text_time); 
    } 

} 
+0

Но как мне сказать таймеру использовать новую ссылку? В настоящее время таймер обновляет TextView внутри метода onTick(). Я обновляю свой первый пост с кодом, чтобы сделать его понятным. –

+0

Do 'if (MyActivity.this! = Null && textTime == null) textTime = MyActivity.this.findViewById (R.id.mytxt);' inside 'onTick()' –

+0

Это не сработало. 'textTime' никогда не становится' null', и когда я вызываю 'prepareTimer()' второй раз, при повторном переключении с B на A новый 'textTime' является другим объектом. Старый таймер продолжает обновлять старый. –

Смежные вопросы