2011-07-05 54 views
2

我正在使用LWUIT ResrouceEditor(最新的SVN代碼修訂版1513)來生成UI狀態機。如何在使用LWUIT ResourceEditor構建的UI中使用異步命令

我想顯示一個等待屏幕,當用戶使用當前窗體上的按鈕調用長時間運行的命令時。我相信我可以在鏈接按鈕上的命令時使用異步選項。我已經建立了一個表單,其中我有一個應該調用異步命令的按鈕。在該按鈕的命令選擇中,我設置了操作以顯示等待屏幕窗體並將該命令標記爲異步。但是,當我使用異步選項時,代碼顯示等待屏幕,但在此之後它將引發NullPointerException。

根據我的理解,一旦您將一個命令標記爲異步,它將從其他線程調用以下方法來處理其處理。

protected void asyncCommandProcess(Command cmd, ActionEvent sourceEvent); 

protected void postAsyncCommand(Command cmd, ActionEvent sourceEvent); 

但是,這種方法沒有被調用,它拋出了NullPointerException。

當我看着LWUIT代碼,在UIBuilder.java(LINENO 2278),我看到它構建新的線程異步命令如下:

new Thread(new FormListener(currentAction, currentActionEvent, f)).start(); 

但是通過調試程序運行時,它我看到currentAction和currentActionEvent始終爲空。因此,當FormListener線程開始運行時,它永遠不會調用上述兩種異步命令處理方法。請參閱run()方法的上市,在UIBuilder.java(號線2178)

在上述方法中,由於currentAction爲空,它總是進入else語句,並且由於nextForm也是null,它會導致NullPointerException。

進一步看一下UIBuilder.java代碼,我注意到了導致NullPointer異常的原因。看起來當FormListner被創建時,它會傳遞currentAction和currentActionEvent,但是當時它們是null。相反,代碼應進行如下更改(起始線2264):

if(action.startsWith("@")) { 
    action = action.substring(1); 
    Form currentForm = Display.getInstance().getCurrent(); 
    if(currentForm != null) { 
      exitForm(currentForm); 
    } 
    Form f = (Form)createContainer(fetchResourceFile(), action); 
    beforeShow(f); 
    /* Replace following with next lines for fixing asynchronous command 
     if(Display.getInstance().getCurrent().getBackCommand() == cmd) { 
      f.showBack(); 
     } else { 
      f.show(); 
     } 
     postShow(f); 
     new Thread(new FormListener(currentAction, currentActionEvent, f)).start(); 
     */ 
     new Thread(new FormListener(cmd, evt, f)).start(); 
     return; 
} 

能LWUIT開發團隊一起來看看上面的代碼,審查和解決它。完成上述更改後,調用了異步命令處理方法。

謝謝。

回答

0

感謝您的信息,它可能更好地使用問題跟蹤器這樣的事情(在)。 我會做出類似的改變,但我不明白你爲什麼評論了表單導航部分。

爲了解決等待屏幕的用例,我們有一個更簡單的解決方案:Next Form。只需顯示等待屏幕並在其中定義「下一個窗體」屬性。 這將觸發一個後臺線程被調用(processBackground回調),並且只有當後臺線程完成下一個表單時纔會顯示。

+0

嗨,, 非常感謝您的回覆和出色的GUI構建器。我將來會使用問題跟蹤器。 我需要以編程方式決定什麼應該是下一個基於行動結果的形式,因此我認爲異步命令會很好。此外,我需要在等待屏幕中給用戶一個選項來取消異步操作。 最初我以爲,顯示destForm不會調用asyncProcessCommand方法,因此評論表單導航部分。但是我錯了,沒有必要評論表單導航邏輯。 我也會看看我是否可以使用backgroundProcess。 –

相關問題