LWUIT ResrouceEditor(最新のSVNコードリビジョン1513)を使用してUIステートマシンを生成しています。
現在のフォームのボタンを使用してユーザーが長時間実行コマンドを呼び出したときに、待機画面を表示したいと思います。ボタンのコマンドをリンクするときに非同期オプションを使用できると思います。非同期コマンドを呼び出すボタンがあるフォームを設定しました。そのボタンのコマンド選択で、待機画面フォームを表示するアクションを設定し、コマンドを非同期としてマークしました。ただし、非同期オプションを使用すると、コードは待機画面を表示しますが、その後はNullPointerExceptionがスローされます。
私の理解によると、コマンドを非同期としてマークすると、その処理を処理できる別のスレッドから次のメソッドが呼び出されます。
protected void asyncCommandProcess(Command cmd, ActionEvent sourceEvent);
protected void postAsyncCommand(Command cmd, ActionEvent sourceEvent);
ただし、このメソッドは呼び出されず、NullPointerExceptionがスローされます。
UIBuilder.java(lineno。2278)のLWUITコードを見ると、非同期コマンドの新しいスレッドが次のように構築されていることがわかります。
new Thread(new FormListener(currentAction, currentActionEvent, f)).start();
しかし、デバッガーを介して実行すると、currentActionとcurrentActionEventが常にnullであることがわかります。したがって、FormListenerスレッドの実行が開始されると、上記の2つの非同期コマンド処理メソッドが呼び出されることはありません。UIBuilder.java(行番号2178)のrun()メソッドのリストを参照してください。
public void run() {
if(currentAction != null) {
if(Display.getInstance().isEdt()) {
postAsyncCommand(currentAction, currentActionEvent);
} else {
asyncCommandProcess(currentAction, currentActionEvent);
// wait for the destination form to appear before moving back into the LWUIT thread
waitForForm(destForm);
}
} else {
if(Display.getInstance().isEdt()) {
if(Display.getInstance().getCurrent() != null) {
exitForm(Display.getInstance().getCurrent());
}
Form f = (Form)createContainer(fetchResourceFile(), nextForm);
beforeShow(f);
f.show();
postShow(f);
} else {
if(processBackground(destForm)) {
waitForForm(destForm);
}
}
}
}
上記のメソッドでは、currentActionがnullであるため、常に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開発チームは上記のコードを確認し、確認して修正できますか?上記の変更を行った後、非同期コマンド処理メソッドが呼び出されました。
ありがとうございました。