Java me 如何在使用LWUIT ResourceEditor构建的UI中使用异步命令

Java me 如何在使用LWUIT ResourceEditor构建的UI中使用异步命令,java-me,lwuit,lwuit-resource-editor,Java Me,Lwuit,Lwuit Resource Editor,我正在使用LWUIT ResrouceEditor(最新SVN代码修订版1513)生成UI状态机 我想在用户使用当前表单上的按钮调用长时间运行的命令时显示等待屏幕。我相信我可以在链接按钮上的命令时使用异步选项。我已经设置了一个表单,其中有一个按钮可以调用异步命令。在该按钮的命令选择中,我将操作设置为显示等待屏幕窗体,并将该命令标记为异步。但是,当我使用异步选项时,代码会显示等待屏幕,但之后会抛出NullPointerException 根据我的理解,一旦将命令标记为异步,它将从另一个线程调用以下

我正在使用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)中的LUIT代码时,我发现它为异步命令构造了新线程,如下所示:

new Thread(new FormListener(currentAction, currentActionEvent, f)).start();
但当通过调试器运行它时,我看到currentAction和currentActionEvent总是空的。因此,当FormListener线程开始运行时,它从不调用上述两种异步命令处理方法。请参见UIBuilder.java中run()方法的列表(行号2178)

在上面的方法中,由于currentAction为null,因此它总是进入else语句,并且由于nextForm也为null,因此它会导致NullPointerException

在进一步查看UIBuilder.java代码时,我注意到是什么导致了NullPointer异常。似乎在创建FormListner时,会传递currentAction和currentActionEvent,但此时它们为null。相反,应按如下方式更改代码(从第2264行开始):

lwuit开发团队可以看看上面的代码,检查并修复它吗。在我进行上述更改之后,调用了异步命令处理方法


谢谢。

谢谢您提供的信息,使用问题追踪器进行类似操作可能更好(在)。 我将做一个类似的更改,尽管我不明白你为什么要注释掉表单导航部分

为了解决等待屏幕的用例,我们有一个更简单的解决方案:下一个表单。只需显示等待屏幕,并在其中定义“下一个表单”属性。
这将触发要调用的后台线程(processBackground回调),并且只有当后台线程完成时,才会显示下一个表单。

感谢您提供的信息,使用问题跟踪器进行类似操作可能更好(在)。 我将做一个类似的更改,尽管我不明白你为什么要注释掉表单导航部分

为了解决等待屏幕的用例,我们有一个更简单的解决方案:下一个表单。只需显示等待屏幕,并在其中定义“下一个表单”属性。
这将触发要调用的后台线程(processBackground回调),并且只有在后台线程完成后,才会显示下一个表单。

Hi Shai,非常感谢您的响应和出色的GUI生成器。我将在将来使用问题跟踪器。我需要根据操作结果以编程方式决定下一个表单应该是什么,因此我认为异步命令会很好。另外,我需要在等待屏幕中为用户提供一个选项来取消异步操作。最初我认为,显示destForm不会调用asyncProcessCommand方法,因此对表单导航部分进行了注释。但是我错了,没有必要对表单导航逻辑进行注释。我还将看看是否可以使用backgroundProcess。嗨,Shai,非常感谢您的回复和出色的GUI构建器。我将在将来使用问题跟踪器。我需要根据操作结果以编程方式决定下一个表单应该是什么,因此我认为异步命令会很好。另外,我需要在等待屏幕中为用户提供一个选项来取消异步操作。最初我认为,显示destForm不会调用asyncProcessCommand方法,因此对表单导航部分进行了注释。但是我错了,没有必要对表单导航逻辑进行注释。我也会看看我是否可以使用背景流程。
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);
        }
     }
  }
}
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;
}