Создание секундомера, который обновляет в потоке пользовательского интерфейса Android - PullRequest
1 голос
/ 19 марта 2012

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

Это мой пользовательский метод 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);
}

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

1 Ответ

2 голосов
/ 20 марта 2012

Я думаю, что ваша ошибка в том, что вы используете handleMessage вместо sendMessage.

Более простым подходом может быть использование метода runOnUiThread и отказ от обработчика.

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

...