2012-12-24 53 views
7

我試圖理解用於管理UI交互的三種方法之間的區別。如何修改這個示例代碼,以顯示更新三種方法之間的區別黑莓

我真的很困惑這三個術語,當試圖找出他們在真實情況下。

下面的代碼顯示了invokeAndWait方法的功能,但如果我用 代替invokeLater或getEventLock(),程序將以完全相同的方式工作。

有人可以修改代碼以顯示用於更新UI的三種 方法之間的區別嗎?

public final class HelloWorldMainScreen extends MainScreen 
{ 
    private LabelField labelField; 
    public HelloWorldMainScreen() 
    {   
     labelField = new LabelField("Hello World");  
     add(labelField); 
     MainScreenUpdaterThread thread = new MainScreenUpdaterThread(this); 
     thread.start(); 
    } 

    public void appendLabelText(String text){ 
     labelField.setText(labelField.getText()+"\n"+text); 
    } 
} 

public class MainScreenUpdaterThread extends Thread { 
    HelloWorldMainScreen mainScreen; 

    public MainScreenUpdaterThread(HelloWorldMainScreen mainScreen){ 
     this.mainScreen = mainScreen; 
    } 

    public void run(){ 
     for (int i = 0; i < 10; i++) { 
      try{ 
       Thread.sleep(5000); 
      }catch(InterruptedException ex){}; 
      UiApplication.getUiApplication().invokeAndWait(new Runnable() { 

       public void run() { 
        mainScreen.appendLabelText("Update");     
       } 
      }); 
     } 
    } 
} 

這三個概念是非常混亂的許多人開始這樣任何解釋性源代碼 描述其功能將是任何人都強烈有益的,我想。

在此先感謝!

回答

6

我對三種不同的方法理解:

  • Application.getEventLock() - 讓事件儘快
  • UiApplication.invokeLater()鎖定 - 把Runnable到事件隊列,它會之後被投入之前,所有其它任務執行此隊列
  • UiApplication.invokeAndWait() - 同前一個除了調用線程將被停止,直到Runnable將運行

我的個人意見從不使用第一種方法。我不認爲我的任何繪製或UI更改任務都優先於其他任務已放入事件隊列。

我主要使用第二種方法,當我實現了一些模式彈出式對話框選擇時,我使用了最後一次。

2

getEventLock():檢索應用程序用戶界面事件鎖定。 如果工作線程希望執行用事件線程序列化的代碼,那麼工作線程應該在該線程上同步。您的工作線程應該只在很短的時間內保持鎖定狀態,因爲此操作會暫停線程調度程序。

涉及設備用戶界面的任何操作都必須在保持鎖定的情況下完成。 UI系統還保證它調用的任何方法都將在已有鎖的線程上執行。

應用程序不應該在此對象上調用通知或等待。

invokeLater():將可運行對象放入此應用程序的事件隊列中。 調用此方法傳遞可運行對象,以便在處理完所有未決事件後,在調度線程上調用該對象的run()方法。

如果沒有事件分派線程(即hasEventThread()返回false),那麼當隊列超過其大小限制時,最後一個要排隊的項目將被刪除。注意:如果應用程序沒有事件線程,則可以調用setAcceptEvents(boolean)來通知運行時系統應用程序不再接受事件。排隊到該應用程序的所有事件隨後被丟棄。

invokeAndWait():將可運行對象放入此應用程序的事件隊列中,並等待處理。 調用此方法傳遞可運行對象,以便在處理完所有未決事件後,在調度線程上調用該對象的run()方法。

該方法阻塞,直到插入事件被處理(即,直到可運行對象的run()方法返回爲止)。

在事件派發線程上調用此方法是安全的。在這種情況下,runnable將立即執行。

如果沒有事件分派線程(即hasEventThread()返回false),那麼當隊列超過其大小限制時,最後一個要排隊的項目將被刪除。注意:如果應用程序沒有事件線程,則可以調用setAcceptEvents(boolean)來通知運行時系統應用程序不再接受事件。排隊到該應用程序的所有事件隨後被丟棄。

API文檔:http://www.blackberry.com/developers/docs/4.3.0api/net/rim/device/api/system/Application.html#invokeLater(java.lang.Runnable

相關問題