GWT异步调用阻止UI

GWT异步调用阻止UI,gwt,asynccallback,Gwt,Asynccallback,我有一个文本框,用户可以在其中键入字符,并打开一个建议框。 我已启动了密钥更新事件。设置了一个计时器,启动异步调用后,异步调用成功后,将加载建议列表。 问题是,当我开始键入字符时,浏览器的加载符号会出现,在异步调用成功返回并显示建议之前,它不会让我在文本框中键入更多字符。 关键是,如果调用是异步的,为什么浏览器会阻止UI上的事件 下面是代码。fire事件调用异步调用并打印fire结束事件消息。因此,异步调用不会阻塞。 公共void showSuggestions(最终字符串查询){ ArrayL

我有一个文本框,用户可以在其中键入字符,并打开一个建议框。 我已启动了密钥更新事件。设置了一个计时器,启动异步调用后,异步调用成功后,将加载建议列表。 问题是,当我开始键入字符时,浏览器的加载符号会出现,在异步调用成功返回并显示建议之前,它不会让我在文本框中键入更多字符。 关键是,如果调用是异步的,为什么浏览器会阻止UI上的事件

下面是代码。fire事件调用异步调用并打印fire结束事件消息。因此,异步调用不会阻塞。 公共void showSuggestions(最终字符串查询){

ArrayList列表;
System.out.println(“显示建议”);
if(query.length()>0){
GWT.log(查询);
list=cacher.getCachedvalues(查询);
//列表=新的ArrayList();
如果(列表!=null){
如果(!isTabOut()| |!isfuzzle()){
display.showSuggestions(PCTSuggestBox.this,list,true,isAutoSelectEnabled(),suggestionCallback);
}否则{
display.hideSuggestions();
}
}否则{
this.firevent(newsSuggestionEvent(查询,限制));
System.out.println(“火灾结束事件”);
}
//display.showSuggestions(PCTSuggestBox.this,null,true,isAutoSelectEnabled(),suggestionCallback);
}否则{
display.hideSuggestions();
}
}

发生这种情况的原因可能有1000个。异步回调实际上并不那么异步。它只在发送实际HTTP请求时才阻止UI线程。但像往常一样,在UI线程中构造请求、解析响应和处理回调体。可能的罪犯:

  • 大量数据通过网络发送
  • 接收数据的一些无效处理
  • 无效地提出建议
  • 在devmode中使用Chrome(Chrome在devmode中非常慢)

我不会在这里写下其他996原因,因为这样可以更容易地测量代码的哪一部分速度慢。

避免对输入的每一次按键(如文本框)进行异步调用

当你打字时,你在谷歌搜索的建议中看到的不是GWT

如果我想在您键入时实现建议,我不知道如何在GWT中正确实现它。我必须用javascript编写应用程序。输入服务时的建议将位于单独的隐藏隔离框架/iframe中。keyup处理程序将与该帧通信。这样,我觉得(不是我说的对),文本框I/o不会与异步通信冲突

也许,你应该考虑谷歌JavaScript关闭工具。 GWT使您几乎不可能寻址另一个GWT应用程序,它将位于另一个框架上,而不通过基于服务器的总线

您需要一个协调的父帧,以便两个或多个需要相互引用和通信的帧必须是该父帧的子帧

但是,您可以用javascript实现这一点。用Javascript编写将您从GWT的束缚和束缚中解放出来

然后,您也许可以将该服务包装到一个JSNI调用中,以便继续使用GWT进行布局。我看到的问题是,如何让JSNI调用的外部Javascript能够看到文本框?也许,给文本框一个ID?但等一下,GWT不想让您给小部件分配一个ID。您可以给它分配一个Sure-debugID,但这在生产代码中可行吗


您可以将uibinder中的HTML元素用于文本框。uibinder允许您为HTML元素分配一个id。但是,您必须通过dom读取输入文本框的值。我从来没有尝试过以这种方式混合GWT/javascript,只是我的思维实验。

您是否会阻止事件处理程序中异步调用的完成?你能分享一些你的实际代码吗?完全不同意。在GWT中输入时建议非常有效。然而,与作者不同的是,我使用了标准的GWTAPI。正如Alexey所建议的,使用GWT
SuggestBox
,一切都已经完成了。我还打赌主要原因是开发模式。
    ArrayList<PCTSuggestion> list;
    System.out.println("Show Suggestions");
    if (query.length() > 0) {
        GWT.log(query);
       list = cacher.getCachedvalues(query);
       //list = new ArrayList<PCTSuggestion>();
       if(list != null) {
            if(!isTabOut() || !isBlurred()) {
                display.showSuggestions(PCTSuggestBox.this, list, true, isAutoSelectEnabled(), suggestionCallback);
            } else {
                display.hideSuggestions();
            }
        } else {

             this.fireEvent(new NewSuggestionEvent(query, limit));    
             System.out.println("End of Fire Event");

        }
        //display.showSuggestions(PCTSuggestBox.this, null, true, isAutoSelectEnabled(), suggestionCallback);
    } else {
        display.hideSuggestions();
    }
}