2012-03-19 3 views
1

Я пытаюсь выяснить, как создать пользовательский хронометр, который точнее до сотой секунды. Я просмотрел много других подобных вопросов и решил попробовать его с помощью потока и обработчика.Создание секундомера, который обновляется в потоке пользовательского интерфейса Android

Это мой пользовательский метод handleMessage:

public void handleMessage(Message msg) { 
    String timeText = msg.getData().getString("time"); 
    watch.setText(timeText); 
} 

Объект часы просто TextView, который инициализируется в OnCreate().

И это основной кусок моего запуска метода:

while(true) { 
    long timeElapsed = System.currentTimeMillis() - startTime; 
    int hundreths = (int)((timeElapsed % 1000)/10); 
    int seconds = (int)((timeElapsed % 60000)/1000); 
    int minutes = (int)(timeElapsed/60000); 
    Bundle bundle = new Bundle(); 
    bundle.putString("time", String.format("d:%02d.%02d", minutes, seconds, hundreths)); 
    Message msg = handler.obtainMessage(); 
    msg.setData(bundle); 
    handler.handleMessage(msg); 
} 

Я понимаю, что вся идея с помощью обработчика является то, что только поток пользовательского интерфейса может обновить элементы на экране, но я все еще получаю a CalledFromWrongThreadException с сообщением, что только исходный поток, который начал создавать иерархию View, может вызывать на нем методы. Я смущен тем, что именно я делаю неправильно.

+0

azertiti правильно, вы должны вызвать 'SendMessage()' вместо 'handleMessage()'. Если вы хотите, чтобы что-то произошло в вашем потоке пользовательского интерфейса, тогда нужно вызвать метод - обработчики сделают это для вас, если вы сначала отправите сообщение в обработчик потока пользовательского интерфейса. Если вы вызываете это прямо из своего фонового потока, тогда он запускается в фоновом потоке, и все выполняется оттуда тоже и так далее. – zapl

+0

Хорошо, теперь я понимаю свою ошибку. Если бы я использовал метод runOnUiThread, я бы назвал его из Ui-метода, который принимает мой runnable? Мое беспокойство состоит в том, что тогда он будет мешать работе с потоком Ui, поскольку цикл является непрерывным? – jmh

+0

Если вы используете runOnUiThread, пройденный runnable будет выполнен в другом потоке. Нет помех в потоке пользовательского интерфейса. – azertiti

ответ

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