使用计时器更新GUI:为什么它不起作用?

时间:2009-06-12 12:23:50

标签: android user-interface timer

我正在创建视频录制应用程序,并使用标签txtStatustxtTime覆盖视频预览。

相机按钮启动/停止定时器,定时调用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 个答案:

答案 0 :(得分:3)

定时器在计时器线程上运行。您应该只从UI线程更新GUI。有几种方法可以做到这一点。最简单的一个是AsyncTasks或将事件发布到UI处理程序。某些函数在非GNI线程上调用时可以正常工作,但是没有详细记录。我从未见过刷新功能。我一直使用invalidate(UI线程)或postInvalidate(后台线程)。我认为setText在内部调用了它。

答案 1 :(得分:0)

更新每个控制调用control.Refresh()form.Refresh()后 - 这会强制立即重新绘制控件。

在你的情况下:

txtTimer.setText(strTime); // the text doesn't change!
txtTimer.Refresh();