2014-01-05 3 views
2

В моем андроид приложения, у меня есть следующий соответствующий фрагмент коды:Повторного использования таймера в андроиде

/*Code outside*/  
button.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     Timer t = new Timer(); 
     t.scheduleAtFixedRate(
      new TimerTask(){ 
       public void run(){ 
        stuffToBeDone(); 
       } 
      },someVariableDelay,someVariablePeriod); 
    } 
} 

Все шло хорошо, пока я не заметил, что stuffToBeDone() был запущен один раз за каждый раз, когда я нажимаюсь кнопка. Насколько я понимаю, каждый раз вызывается onClick(), и старый таймер больше не должен существовать, но как-то выживает TimerTask.

Во второй кнопке нажмите, у меня больше нет ссылки на первый таймер на cancel() это (потому что его больше не должно существовать). И если я объявлю таймер как окончательный переменной в коде за пределами, так что я могу это сделать, после отмены я больше не могу его повторно использовать. Итак, как я могу закончить TimerTask, но затем все еще могу использовать таймер?

+0

Вы можете delcare 'Таймер T' в качестве переменной экземпляра инициализации в' onCreate' на кнопку выберите расписание таймера а затем вы можете вызвать 'cancel()' в любое время, когда хотите – Raghunandan

+0

@Raghunandan В предпоследнем предложении я указываю, что если я это сделаю, я больше не смогу его повторно использовать. Но я думаю, что это должно быть в последнем вопросе для большей ясности. – chubakueno

+0

повторным использованием, что вы имеете в виду. Вы можете помнить, что старое значение отменило таймер и снова запустилось со старым значением – Raghunandan

ответ

4

Android Таймер нитка основан на веб-сайте Android Developers:

http://developer.android.com/reference/java/util/Timer.html

Когда таймер больше не требуется, пользователи не должен вызвать отмены(), который выпускает нить таймера и другие ресурсы. Таймеры, явно не аннулированные, могут удерживать ресурсы неограниченно долго.

Я бы порекомендовал инстанцировании таймер внутри onclicklistener только есть что-то похожее на это:

/*Code outside*/  
Timer t = null; 
button.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     if(t == null) 
      t = new Timer(); 
     else 
      t.cancel(); 
     t.scheduleAtFixedRate(
      new TimerTask(){ 
       public void run(){ 
        stuffToBeDone(); 
       } 
      },someVariableDelay,someVariablePeriod); 
    } 
} 
+0

Для этого * t * должна быть конечной переменной. Но если это конечная переменная, я не могу назначить ее новым таймером внутри события * onClick() *. – chubakueno

+0

@chubakueno почему окончательный? проверьте java-документы http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html#accessing. Вы объявляете таймер таймера перед onCreate как переменную экземпляра. – Raghunandan

+0

Почему бы не поместить объявление таймера в определение класса OnClickListener? –

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