2012-12-26 127 views
1

使用定時器我想以這種方式來使用定時器在我的黑莓手機項目 -黑莓項目

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

,但在執行程序時,我得到一個運行時異常。 有人可以告訴我這段代碼有什麼問題嗎?或者在BlackBerry項目中使用Timer的任何其他技巧。

我的目標是推動SplashScreen 10秒,然後MyScreen頁面打開。所以我想在打開「自選畫面」頁面時使用計時器10秒延遲,在計時器期間,我將顯示SplashScreen頁面。

+1

你可以發佈堆棧跟蹤嗎? –

+0

哪個操作系統版本? –

+0

我正在使用Windows 7中的「BlackBerry Java sdk 7.1」。 –

回答

2

由於Richard mentioned in his answer,你有問題,因爲你試圖從主線(又名「UI」)線程以外的線程操縱UI。你只需要一個小的變化,使你的代碼正常工作:

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

以上爲您發佈,黑莓的Java代碼的等價物。

我的目標是推動SplashScreen 10秒,然後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 */); 

    } 

這確實你問什麼,但鏈接,理查德還提供允許用戶儘早關閉啓動畫面。這可能是也可能不是你想要的,所以我只是提供上面的替代方案。

-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(),而你不知道「T使用意圖像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 {}趕上(){}最後{}就是異常處理。 基本上,如果在試圖睡眠3000毫秒時發生任何錯誤,那麼它將捕獲所有異常(也稱爲錯誤),並執行catch(){}中的任何操作。然後,在try {}(如果沒有發現異常)或catch(){}(如果發現錯誤)完成之後,它會執行finally {}中的任何操作。這個案例最終將推動下一個屏幕。

+0

@ chriswins2much- thanx但我只在BlackBerry中遇到問題,而且您的代碼也不適用於BlackBerry。 –

+0

BlackBerry用什麼語言編寫的? – chriswins2much

+0

@ chriswins2much-在Java中 –

1

很難說究竟到底發生了什麼問題,但有一件事你不應該在非事件線程的線程上與用戶界面交互。

它不會教你如何使用計時器,但有一個developer article如何做一個啓動畫面。

0

您每200毫秒推一個新的屏幕... 您需要在推送屏幕時終止計時器。請記住,時間間隔以毫秒爲單位,因此您需要計算該時間間隔。

祝你好運!