在BlackBerry项目中使用Timer

时间:2012-12-26 00:34:10

标签: java blackberry java-me timer timertask

我正试图以这种方式在我的BlackBerry项目中使用Timer -

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    public void run() {
        pushScreen(new MyScreen()); 
    }
},200);

但是我在执行程序时遇到了运行时异常。 有人可以告诉我这段代码有什么问题吗?或者在BlackBerry项目中使用Timer的任何其他提示。

我的目标是将SplashScreen推送10秒,然后打开MyScreen页面。所以我想在打开MyScreen页面的同时使用计时器延迟10秒,在计时器期间我将显示SplashScreen页面。

4 个答案:

答案 0 :(得分:2)

作为Richard mentioned in his answer,您遇到了问题,因为您试图从主(又称“UI”)线程以外的线程操作UI。您只需进行一些小改动即可使代码正常工作:

UiApplication.getUiApplication().invokeLater(new Runnable() {
                                                public void run() {
                                                    pushScreen(new MyScreen()); 
                                                }
                                             }, 
                                             200   /* delay */, 
                                             false /* repeat = no */);

以上相当于您为BlackBerry Java发布的代码。

  

我的目标是将SplashScreen推送10秒,然后是MyScreen页面   开放。所以我想在打开时使用计时器延迟10秒   MyScreen页面和计时器期间我将显示SplashScreen   页。

如果这实际上是您想要做的,那么只要在应用启动后立即显示SplashScreen

public class MyApp extends UiApplication
{
   /**
    * Entry point for application
    * @param args Command line arguments (not used)
    */ 
   public static void main(String[] args)
   {
      // Create a new instance of the application and make the currently
      // running thread the application's event dispatch thread.
      MyApp theApp = new MyApp();       
      theApp.enterEventDispatcher();
   }

   public MyApp()
   {        
      // Push a screen onto the UI stack for rendering.
      final SplashScreen splashScreen = new SplashScreen();
      pushScreen(splashScreen); 

      UiApplication.getUiApplication().invokeLater(new Runnable() {
                                                      public void run() {
                                                          pushScreen(new MyScreen()); 
                                                          popScreen(splashScreen);
                                                      }
                                                   }, 
                                                   10*1000   /* delay in msec */, 
                                                   false /* repeat = no */);

   }

这就是你提出的问题,但Richard提供的链接也允许用户提前解除启动屏幕。这可能是也可能不是你想要的,所以我只是提供上面的替代方案。

答案 1 :(得分:1)

很难说究竟出了什么问题,但是你不应该做的一件事就是在不是事件线程的线程上与用户界面进行交互。

它不会教你如何使用计时器,但有关于如何使用闪屏的developer article

答案 2 :(得分:0)

你每200毫秒推一个新的屏幕...... 按下屏幕时需要终止计时器。请记住,间隔是以毫秒为单位,因此您需要计算它。

祝你好运!

答案 3 :(得分:-2)

对于Android,你可能想要做这样的事情:

initialize();
setButtonListeners();
new Thread() {
    public void run() {
        try {
            sleep(3000);
        } catch (Exception e) {
        } finally {
                Intent menuIntent = new Intent(SplashLoadScreen.this,
                        MainMenu.class);
                startActivity(menuIntent);
        }
    }
}.start();

我对BlackBerry不太熟悉,但看起来你使用的是pushScreen()而不是startActivity(),并且你不像Android那样使用Intent,所以也许就是这样:

initialize(); //Method to initialize all variables you might want to use.
//...Some code
new Thread() {
    public void run() {
        try {
            sleep(3000); //Time in milliseconds 
            //to make this thread sleep before executing whatever other code.
        } catch (Exception e) {
        } finally {
                pushScreen(new MyScreen()); //Push next screen
        }
    }
}.start();

try {} catch(){} finally {}是异常处理。 基本上,如果在尝试睡眠3000毫秒时发生任何错误,那么它将捕获所有异常(a.k.a。错误)并执行catch(){}中的任何操作。然后,在try {}(如果没有找到异常)或者catch(){}(如果已经找到错误)完成后,它会执行finally {}中的任何操作。这个案例最终会推动下一个屏幕。