2012-04-16 2 views
2

Im с использованием Timer для постоянного обновления TextView, но у меня возникли проблемы с повторным запуском таймера во время метода onResume(). Я использую timer.cancel() в методах onPause() и onDestroy(), но как перезапустить таймер в onResume()?Перезапуск таймера в методе onResume()?

Это мой код таймера ...

int delay = 1000; 
int period = 1000; 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 
     //I update the TextView here 
    } 

}, delay, period); 

ответ

2

Вы не перезапускает таймер. Вместо этого используйте новый таймер i.e внутри onResume() создайте новый таймер. Поскольку вы больше не используете предыдущий, сбор мусора позаботится об этом. Таким образом, в onResume() используйте следующий код:

timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

public void run() { 

    //update the TextView here 

} 

}, delay, period); 
+0

Но я думал, что вы не можете обновить GUI с помощью таймера, поскольку он создает новый поток и не Nto выполнить на основном потоке пользовательского интерфейса – Snake

+0

@Snake: Некоторые функции обновления GUI работают при вызове из не-GUI потоков, но это плохо документировано. Для других функций, которые не могут быть вызваны вне потока GUI, мы можем использовать функцию runOnGUIThread(), если это абсолютно необходимо. Я предпочел бы использовать Handler для выполнения этой задачи. – binW

5

Простейшее альтернативой является использование Handler класса. Я бы не рекомендовал класс Timer, потому что он не имеет никакого отношения к жизненному циклу вашей деятельности, и вам придется беспокоиться о любых потенциальных проблемах с потоками. Красота использования Handler заключается в том, что все ваши обратные вызовы будут в основном потоке (так что не нужно беспокоиться о проблемах с потоками). Ниже приведен простой пример того, как это сделать.

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    .... 
    mHandler = new Handler(); 
} 

@Override 
protected void onResume() 
{ 
    mHandler.postDelayed(myRunnable, UPDATE_RATE); 
} 

@Override 
protected void onPause() 
{ 
    mHandler.removeCallbacks(myRunnable); 
} 

private final Runnable myRunnable= new Runnable() { 
    @Override 
    public void run() 
    { 
     //Do task 
     mHandler.postDelayed(myRunnable, UPDATE_RATE); 
    } 
} 
Смежные вопросы