我正在使用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開發團隊一起來看看上面的代碼,審查和解決它。完成上述更改後,調用了異步命令處理方法。
謝謝。
嗨,, 非常感謝您的回覆和出色的GUI構建器。我將來會使用問題跟蹤器。 我需要以編程方式決定什麼應該是下一個基於行動結果的形式,因此我認爲異步命令會很好。此外,我需要在等待屏幕中給用戶一個選項來取消異步操作。 最初我以爲,顯示destForm不會調用asyncProcessCommand方法,因此評論表單導航部分。但是我錯了,沒有必要評論表單導航邏輯。 我也會看看我是否可以使用backgroundProcess。 –