Я использую таймер для создания секундомера. Таймер работает за счет увеличения целочисленного значения. Затем я хочу отображать это значение в activity, постоянно обновляя textview.
Вот мой код из сервиса, в котором я пытаюсь обновить textview действия:
protectedstaticvoidstartTimer() { isTimerRunning = true; timer.scheduleAtFixedRate(newTimerTask() { publicvoidrun() { elapsedTime += 1; //increase every sec StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview } }, 0, 1000); }
Я получил какую-то ошибку об обновлении пользовательского интерфейса не в том потоке.
Как я могу адаптировать свой код для выполнения этой задачи постоянного обновления textview?
publicHandlermHandler=newHandler() { publicvoidhandleMessage(Message msg) { StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview } };
Приведенный выше код будет работать...
Примечание: Обработчики должны быть созданы в вашем основном потоке, чтобы вы могли изменять содержимое пользовательского интерфейса.
Ответ 2
Вы должны использовать Handler вместо этого для обновления пользовательского интерфейса каждые X секунд. Вот еще один вопрос, который показывает пример: Повторить задачу с задержкой по времени?
Ваш подход не работает, потому что вы пытаетесь обновить пользовательский интерфейс из потока, отличного от пользовательского интерфейса. Это запрещено.
этот блок кода основан на обработчике, но вам не нужно создавать свой собственный экземпляр обработчика.
Ответ 4
TimerTask реализует функцию Runnable, которая превращает его в поток. Вы не можете обновить основной поток пользовательского интерфейса напрямую из другого потока без некоторой работы. Единственное, что вы могли бы сделать, это использовать Async Task для создания таймера и ежесекундно публиковать обновление, которое будет обновлять пользовательский интерфейс.