我正在创建视频录制应用程序,并使用标签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方法中调用时无效。
答案 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();