2010-12-04 5 views
0

Я пытаюсь иметь счетчик (количество секунд и минут) и обновлять его на дисплее каждую секунду.Android: изменение элемента XML по таймеру

У меня есть этот код в onCreate моего класса, который простирается Activity:

timeOnCall = (TextView) findViewById(R.id.time); 
minutes = seconds = 0; 
timeOnCall.setText(minutes + ":" + seconds); 

// Implements the timer 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 
    public void run() { 
     ++seconds; 
     if (seconds == 60) { 
      seconds = 0; 
      ++minutes; 
     } 
     // Display the new time 
     timeOnCall.setText(minutes + ":" + seconds); 
    } 
}, 1000, 1000); 

К сожалению, я получаю следующее сообщение об ошибке:

android.view.ViewRoot$CalledFromWrongThreadException: Только оригинальный thread, который создал иерархию вида можно потрогать его взглядов.

Я не уверен, как это исправить, поскольку оно уже находится в методе onCreate(). Кто-нибудь знает решение?

ответ

0

Вы можете сделать это с помощью обработчика, что-то облегченный это:

final Handler mHandler = new Handler(); 
final Runnable updateText = new Runnable() { 
    public void run() { 
     timeOnCall.setText(minutes + ":" + seconds); 
    } 
}; 

в OnCreate вы можете запустить:

onCreate(Bundle b) { 
... 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      ++seconds; 
      if (seconds == 60) { 
       seconds = 0; 
       ++minutes; 
      } 

      // Display the new time 
     mHandler.post(updateText); 
     } 
    }, 1000, 1000); 
} 
+0

Большое спасибо! Очень полезно! – James

0

Это потому, что вы пытаетесь изменить текстовое представление из другой темы. Вы не можете этого сделать. Вам нужно отправить сообщение обратно в поток, которому принадлежит текстовое представление.

public void run() 

Это начинает новый поток, который отделен от того, что работает с вашим пользовательским интерфейсом.

Редактировать: Есть много примеров онлайн для кода, который вы ищете. Просто Google что-то вроде «обработчик сообщений потоков Android».

+0

спасибо. Я не уверен, как это сделать, у вас есть учебник или пример для меня, пожалуйста? Это очень поможет. Благодаря! – James

+0

Так это «новая TimerTask», которая должна быть новой Thread, которая делает .setText(), пожалуйста? – James

+0

Я поместил весь код в метод запуска нового потока, который я создал. Это все еще падает. – James

0

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

http://developer.android.com/resources/articles/timed-ui-updates.html

+0

Большое спасибо! – James

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