3

创建会话后,我想在特定时间后再次调用一个方法 - 即 5 秒。

但是当我调用一个方法时,它会给我一个错误。这是示例代码。

  public class RunFunction extends MainScreen{        
      public RunFunction()        
      {        
          //Call Function again and again after 5 sec    
          setTitle("Timer");    
          Timer timer = new Timer();    
          timer.schedule(new TimerTask() {    
             public void run() {    
                BasicEditField b = new BasicEditField("Hello", "");    
                String a = b.getText();    
                Dialog.alert("Value " +a);    
             } 
          }, 5000);          
      }    
  }

我需要与此相关的帮助。你能提供任何示例代码吗?

4

2 回答 2

3

来自Timer 类的 BlackBerry 文档

线程调度任务以供将来在后台线程中执行的工具。

因此,首先要了解的是,您在该run()方法中所做的任何工作都将在后台线程上运行。后台线程不允许直接修改 UI 。你可能会得到一个IllegalStateException这样做。

也许这只是测试代码,但是这段代码

        BasicEditField b = new BasicEditField("Hello", "");    
        String a = b.getText();    
        Dialog.alert("Value " +a);    

有点混乱。它创建一个BasicEditField,但仅使用它来获取String传递给它的值。仅实例化一个字段不会将其添加到屏幕中。所以,你需要打电话

add(b);

在此代码之后显示编辑字段。但同样,那将是直接修改 UI。所以,在你的情况下,你可能只需要通过调用来包装你的代码UiApplication#invokeLater()

  timer.schedule(new TimerTask() {    
     public void run() {
        // this code executed on background thread -> not UI safe!

        UiApplication.getUiApplication().invokeLater(new Runnable() {
           public void run() {  
              // this code safely executed on UI thread
              BasicEditField b = new BasicEditField("Hello", "");   
              add(b); 
              String a = b.getText();    
              Dialog.alert("Value " +a);
           }
        });    
     } 
  }, 5000);          

接下来,调用Timer#schedule(TimerTask,long)只会安排您的任务在 5000 毫秒后运行一次。如果您希望它一次又一次地运行,请使用带有三个参数的版本schedule(TimerTask,long,long)。最后一个参数是每次调用定时器任务方法之间的时间量。run()

于 2013-05-01T10:06:01.973 回答
0

Timer 和 TimerTask java 类的这个示例提供了一些关于您想要做什么的见解:

http://javaprogramming.language-tutorial.com/2012/02/demonstrate-timer-and-timertask.html

于 2013-04-30T14:48:48.050 回答