1

この方法でBlackBerryプロジェクトでタイマーを使用しようとしています-

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

しかし、プログラムの実行中にランタイム例外が発生します。誰かがこのコードの何が問題になっているのか教えてもらえますか?または、BlackBerryプロジェクトでタイマーを使用するためのその他のヒント。

私の目標は、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 */);

上記は、BlackBerryJava用に投稿したコードに相当します。

私の目標は、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

何がうまくいかないかを正確に言うのは難しいですが、すべきでないことの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();

私はBlackBerryにあまり詳しくありませんが、startActivity()の代わりにpushScreen()を使用しているようで、Androidのようにインテントを使用していないので、おそらく次のようになります。

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 に答える