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

问题描述:

我正在创建视频录制应用程序,并使用标签txtStatustxtTime覆盖了视频预览。使用计时器更新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(); 
+0

我试过使用txtTimer.refreshDrawableState();但它不起作用。 – 2009-06-12 13:52:57

计时器上的计时器线程上运行。您应该只从UI线程更新GUI。有几种方法可以做到这一点。其中最简单的是AsyncTasks或将事件发布到UI处理程序。在nonGUI线程上调用时,某些函数可以工作,但没有很好的文档记录。我从来没有见过刷新功能。我一直使用invalidate(UI线程)或postInvalidate(后台线程)。我认为setText虽然在内部调用。