1

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

以下是代码。火事件调用异步调用并打印火事件消息的结束。所以异步调用不会阻塞。public void showSuggestions(最终字符串查询){

    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();
    }
}
4

2 回答 2

1

它发生的原因可能有 1000 个。AsyncCallbacks 并不是真的那么异步。只有在发送实际 HTTP 请求时,它才不会阻塞 UI 线程。但是构造请求、解析响应和处理回调体像往常一样发生在 UI 线程中。可能的罪魁祸首:

  • 通过网络发送大量数据
  • 对接收数据的一些无效处理
  • 建议无效
  • 将 Chrome 与 devmode 一起使用(Chrome 在 devmode 下非常慢)

我不会在这里写下其他 996 原因,因为您可以更容易地实际衡量代码的哪一部分是慢的。

于 2011-12-27T13:12:22.083 回答
1

避免对文本框等输入的每次击键进行异步调用。

您在 Google 搜索的“键入时建议”中看到的不是 GWT。

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

也许,您应该考虑使用 Google javascript 关闭工具http://code.google.com/closure/

GWT 使您几乎不可能在不通过基于服务器的偶数总线的情况下处理另一个 GWT 应用程序,该应用程序将位于另一个框架上。

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

但是,您可以在 javascript 中实现该编写。用 javacript 编写可以让您摆脱 GWT 的所有束缚和束缚。

然后,您或许可以将该服务包装到 JSNI 调用中,以便您可以继续使用 GWT 进行布局。我看到的问题是,你如何让你的文本框对 JSNI 调用的外部 Javascript 可见?也许,通过给文本框一个ID?但是等一下,GWT 不想让你给小部件一个 ID。您可以为其分配一个确保调试ID,但这在生产代码中是否可行?

您可以在 uibinder 中为您的文本框使用 HTML 元素。并且 uibinder 允许您为 HTML 元素分配一个 id。但是,那么您将不得不通过 dom 读取输入文本框的值。我从未尝试过以这种方式混合 GWT/javascript,只是我的思想实验。

于 2011-12-28T05:21:44.803 回答