GWT Async Call блокирует пользовательский интерфейс - PullRequest
1 голос
/ 27 декабря 2011

У меня есть текстовое поле, в котором пользователь может вводить символы, и открывается окно с предложением.Я запустил события на событии Key Up.Существует таймер, после которого запускается асинхронный вызов, и при успешном выполнении асинхронного вызова загружается список предложений.Проблема заключается в том, что когда я начинаю набирать символы, появляется символ загрузки браузера, и он не позволяет мне вводить больше символов в мое текстовое поле, пока асинхронные вызовы не вернутся успешно и не отобразятся предложения.Дело в том, что если вызов асинхронный, почему браузер блокирует события в пользовательском интерфейсе.

Ниже приведен код.Событие пожара вызывает асинхронный вызов и печатает сообщение об окончании пожара.Таким образом, асинхронный вызов не блокируется.public void showSuggestions (окончательный запрос String) {

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

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Избегайте асинхронных вызовов при каждом нажатии клавиши ввода, например в текстовом поле.

То, что вы видите в подсказках при поиске Google, не является GWT.

Если бы я хотел реализовать предложения по мере ввода, я бы не знал, как правильно реализовать это в GWT. Я должен был бы написать приложение в JavaScript. Служба "предложения по типу" будет находиться в отдельной скрытой отдельной рамке / кадре. Обработчик keyup будет связан с этим фреймом. Таким образом, я чувствую (не то, что я прав), текстовое поле ввода / вывода не будет конфликтовать с асинхронными сообщениями.

Возможно, вам следует рассмотреть инструменты закрытия Google JavaScript http://code.google.com/closure/.

GWT делает практически невозможным обращение к другому приложению GWT, которое будет находиться в другом кадре, без использования серверной четной шины.

Вам необходим координирующий родительский фрейм, чтобы два или более фрейма, которые должны ссылаться и взаимодействовать друг с другом, были дочерними для этого родительского фрейма.

Однако вы можете добиться этого написания в javascript. Запись в javacript освобождает вас от всех привязей и манжет GWT.

Тогда вы, возможно, могли бы обернуть эту службу в вызов JSNI, чтобы вы могли продолжать использовать GWT для разметки. Проблема, которую я вижу, состоит в том, как бы вы сделали текстовое поле видимым для внешнего Javascript, вызываемого JSNI? Может быть, давая текстовое поле идентификатор? Но подождите, GWT не хочет, чтобы вы дали виджету идентификатор. Вы можете назначить ему гарантированный отладочный ID, но это работоспособно в рабочем коде?

Вы можете использовать элементы HTML в uibinder для вашего текстового поля. И Uibinder позволяет назначить идентификатор для элемента HTML. Но тогда вам придется прочитать значение поля ввода текста через дом. Я никогда не пытался смешивать GWT / javascript таким образом, только мои мысленные эксперименты.

1 голос
/ 27 декабря 2011

может быть 1000 причин, почему это происходит.AsyncCallbacks на самом деле не такой асинхронный.Он не блокирует поток пользовательского интерфейса только при отправке реальных HTTP-запросов.Но создание запроса, анализ ответа и обработка тела обратного вызова происходит в потоке пользовательского интерфейса как обычно.Возможные виновники:

  • сумасшедший объем данных отправляется по сети
  • некоторая неэффективная обработка полученных данных
  • неэффективный рендеринг предложений
  • ИспользованиеChrome с devmode (Chrome очень медленно работает с devmode)

Я не буду здесь описывать другую причину 996, потому что вам будет проще измерить, какая часть вашего кода медленная.

...