Codenameone-何时与对话框一起使用callSerially?

Codenameone-何时与对话框一起使用callSerially?,codenameone,Codenameone,在回答和Codenameone开发者指南的第7.2.1节中,建议使用callSerially调用对话框。我认为这意味着: dlg.showDialog(); 我们应该利用: Display.getInstance().callSerially(() -> { dlg.showDialog(); }); 但我注意到,在Codenameone代码的

在回答和Codenameone开发者指南的第7.2.1节中,建议使用callSerially调用对话框。我认为这意味着:

                    dlg.showDialog();
我们应该利用:

                Display.getInstance().callSerially(() -> {
                    dlg.showDialog();
                });
但我注意到,在Codenameone代码的其他各个部分中,Dialog.shows()并没有以callSerially的形式包装,例如ConnectionRequest.java、NetworkManager.java和XFClient.java。应该按照建议顺序使用callSerially吗?如果不是,那么决定何时为对话框使用callSerially以及何时不使用callSerially的标准是什么

背景:我之所以问这个问题,是因为在实现了所讨论的网络重试逻辑之后,我的用户出现了一些间歇性的(到目前为止不可能可靠地复制)应用程序锁定,我怀疑这可能与我的“是/否”对话框和XFClient中的自定义“网络问题”对话框之间的冲突有关(见下文)这可能同时发生。我想知道我是否应该总是在这些对话框中使用callSerially

protected void setupConnection(ConnectionRequest req) {
        if (timeout > 0) {
            req.setTimeout(timeout);
        }
        if (readTimeout > 0) {
            req.setReadTimeout(readTimeout);
        }

        // remainder is custom code I added..

        if (silentRetryCount > 0) {     
            req.setSilentRetryCount(silentRetryCount);
        }
        req.addExceptionListener(evt -> {    
            if (evt != null) {
                if (req.getSilentRetryCount() > 0) {
                    //  silentRetryCount--;
                    req.setSilentRetryCount(req.getSilentRetryCount() - 1);
                    //  NetworkManager.getInstance().resetAPN();      // private, not sure if we need this?
                    req.retry();
                    return;
                }
                Exception exc = evt.getError();
                Log.e(exc);
                if (Display.isInitialized() && !Display.getInstance().isMinimized()
                        //                        && Dialog.show("Exception", exc.toString() + ": for URL " + url + "\n" + exc.getMessage(), "Retry", "Cancel")) {
                        && Dialog.show("Network Issue", "Hopefully it is just a bump in the road.  Suggest you retry...", "Retry", "Cancel")) {
                    req.retry();
                }
                // note: ConnectionRequest.handleException has an else block here setting retrying= false and killed=true

            }
        });
    }
注意:添加的代码是根据ConnectionRequest.java中的handleException方法建模的。我不知道如何添加resetAPN和else块,所以将它们忽略了。不确定这是不是一个错误


感谢您的帮助。

callSerially
用于对话框的方法应在两种情况下使用:

  • 您已退出EDT-这是必需的
  • 您处于事件链中,希望刷新当前事件。这是一个复杂的边缘情况。因为它不适用于这个案子,所以我不会参与其中
最初,在实现网络管理器逻辑时,我们编写了重试代码。我们当时没有注意到EDT违规,也没有表现得那么明显。不幸的是,像许多这样的bug一样,现在很难摆脱它


对此还有其他解决方案,但更好的解决方案之一是全局使用网络错误处理程序,它更接近您想要的。此问题介绍了它的当前用法:

谢谢。我试图删除所有从EDT中调用的对话框,或者将它们切换为callSerially或callSerially and Wait。祝你好运,这就解决了问题!