Abdullah Haider
Abdullah Haider

Reputation: 195

Blackberry - Call a method after a specified time

After creating a session, i want to call a method again & again after a specific time - i.e. 5 sec.

But when i call a method it gives me an error. Here is the sample code.

  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);          
      }    
  }

I need help related to this. Can you provide any sample code?

Upvotes: 3

Views: 160

Answers (2)

Nate
Nate

Reputation: 31045

From the BlackBerry docs on the Timer class:

A facility for threads to schedule tasks for future execution in a background thread.

So, the first thing to understand is that whatever work you do in the run() method will be run on a background thread. Background threads are not allowed to modify the UI directly. You're probably getting an IllegalStateException by doing that.

Maybe this is just test code, but this code

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

is a little confusing. It creates a BasicEditField, but only uses it to get the String value passed in to it. Just instantiating a field does not add it to a screen. So, you would need to call

add(b);

after this code for the edit field to show. But again, that would be modifying the UI directly. So, in your case, you probably just need to wrap your code with a call to 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);          

Next, calling Timer#schedule(TimerTask,long) will only schedule your task to run once, after 5000 milliseconds. If you want it to run again and again, use the version of schedule(TimerTask,long,long) that takes three parameters. The last parameter is the amount of time between each call to your timer task's run() method.

Upvotes: 3

sweetiewill
sweetiewill

Reputation: 568

This example on Timer and TimerTask java class provides some insights on what you want to do:

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

Upvotes: 0

Related Questions