1

我正在尝试以这种方式在我的 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

4 回答 4

2

正如理查德在他的回答中提到的那样,您遇到了问题,因为您试图从主(又名“UI”)线程以外的线程操作 UI。您只需要稍作改动即可使您的代码正常工作:

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

以上是您发布的 BlackBerry Java 代码的等价物。

我的目标是推动 SplashScreen 10 秒,然后 MyScreen 页面将打开。所以我想在打开 MyScreen 页面时使用计时器延迟 10 秒,在计时器期间我将显示 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 提供的链接还允许用户提前关闭初始屏幕。这可能是也可能不是你想要的,所以我只是提供上面的替代方案。

于 2012-12-26T06:09:55.123 回答
1

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

它不会教您如何使用计时器,但有一篇关于如何制作启动画面的开发人员文章。

于 2012-12-26T02:28:42.663 回答
0

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

祝你好运!

于 2013-11-03T14:39:56.853 回答
-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();

我对黑莓不太熟悉,但您似乎使用 pushScreen() 而不是 startActivity(),而且您不像 Android 那样使用 Intents,所以可能是这样的:

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 毫秒时发生任何错误,那么它将捕获所有异常(也称为错误)并执行 catch(){} 中的任何操作。然后,在 try {}(如果没有发现异常)或 catch(){}(如果发现错误)完成后,它会执行 finally{} 中的任何操作。这个案子终于要推下一个画面了。

于 2012-12-26T01:18:28.223 回答