Использование таймера для обновления GUI: почему он не работает? - PullRequest
1 голос
/ 12 июня 2009

Я создаю приложение для записи видео и наложил предварительный просмотр видео с метками txtStatus и txtTime.

Кнопка камеры запускает / останавливает таймер, который периодически вызывает метод UpdateGUI. Запустив отладку, я вижу, что таймер работает - он вызывает метод updateGUI каждую секунду, но метод не обновляет элементы управления.

Я был бы очень признателен, если бы мог получить подсказку о том, как решить эту проблему.

Вот код:

Это метод, который активирует таймер:

private void startTimer()
{
    updateTimer = new Timer("TimerUpdate");
    updateTimer.scheduleAtFixedRate(new TimerTask(){
        public void run(){
            settings.IncreaseRecordingTime();
            updateGUI();

        }
    }, 0, 1000);
}

Это метод updateGUI:

private void updateGUI()
{
    setStatusLabel();
    String strTime = settings.GetTimerString(); //strTime changes every second (it works as expected)
    txtTimer.setText(strTime);//the text doesn't change!
}

И этот метод вызывается при нажатии кнопки:

private boolean onCaptureButton()
{
    settings.CaptureAction();
    videoPreview.setFrameCallback(settings);
    updateGUI();//here the function updateGUI() works as expected - it changes the txtStatus text from "Preview" to "Recording"
    setTimer();
    return false;
}

Я также добавил несколько комментариев (не знаю, почему updateGUI() работает, когда он вызывается в методе onCaptureButton(), и не работает, когда вызывается внутри метода timer).

Ответы [ 2 ]

3 голосов
/ 13 июня 2009

Таймеры работают в потоке таймеров. Вы должны только обновить графический интерфейс из потока пользовательского интерфейса. Есть несколько способов сделать это. Одним из самых простых является AsyncTasks или отправка событий в обработчик пользовательского интерфейса. Некоторые функции работают при вызове в потоках, отличных от GUI, но это плохо документировано. Я никогда не видел функцию обновления. Я всегда использовал invalidate (поток пользовательского интерфейса) или postInvalidate (фоновый поток). Я думал, что setText вызвал это внутренне, хотя.

0 голосов
/ 12 июня 2009

После обновления каждого контрольного вызова control.Refresh() или form.Refresh() - это заставляет элементы управления немедленно перерисовываться.

В вашем случае:

txtTimer.setText(strTime); // the text doesn't change!
txtTimer.Refresh(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...