使用计时器更新GUI:为什么它不起作用?
问题描述:
我正在创建视频录制应用程序,并使用标签txtStatus
和txtTime
覆盖了视频预览。使用计时器更新GUI:为什么它不起作用?
相机按钮启动/停止,其周期性地调用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()
方法和计时器方法中调用时不工作)。
答
更新每个控制呼叫control.Refresh()
或form.Refresh()
后 - 这会强制控件立即重绘。
你的情况:
txtTimer.setText(strTime); // the text doesn't change!
txtTimer.Refresh();
答
计时器上的计时器线程上运行。您应该只从UI线程更新GUI。有几种方法可以做到这一点。其中最简单的是AsyncTasks或将事件发布到UI处理程序。在nonGUI线程上调用时,某些函数可以工作,但没有很好的文档记录。我从来没有见过刷新功能。我一直使用invalidate(UI线程)或postInvalidate(后台线程)。我认为setText虽然在内部调用。
我试过使用txtTimer.refreshDrawableState();但它不起作用。 – 2009-06-12 13:52:57