Я пытаюсь выяснить, как создать пользовательский хронометр, который точнее до сотой секунды. Я просмотрел много других подобных вопросов и решил попробовать его с помощью потока и обработчика.Создание секундомера, который обновляется в потоке пользовательского интерфейса 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, может вызывать на нем методы. Я смущен тем, что именно я делаю неправильно.
azertiti правильно, вы должны вызвать 'SendMessage()' вместо 'handleMessage()'. Если вы хотите, чтобы что-то произошло в вашем потоке пользовательского интерфейса, тогда нужно вызвать метод - обработчики сделают это для вас, если вы сначала отправите сообщение в обработчик потока пользовательского интерфейса. Если вы вызываете это прямо из своего фонового потока, тогда он запускается в фоновом потоке, и все выполняется оттуда тоже и так далее. – zapl
Хорошо, теперь я понимаю свою ошибку. Если бы я использовал метод runOnUiThread, я бы назвал его из Ui-метода, который принимает мой runnable? Мое беспокойство состоит в том, что тогда он будет мешать работе с потоком Ui, поскольку цикл является непрерывным? – jmh
Если вы используете runOnUiThread, пройденный runnable будет выполнен в другом потоке. Нет помех в потоке пользовательского интерфейса. – azertiti