GWT: Заполнение страницы от хранилища данных с помощью RPC является слишком медленным

Существует ли способ ускорить население страницы с элементами UI GWT, которые сгенерированы от данных, загруженных из хранилища данных? Я могу постараться не делать ненужный вызов RPC, когда страница загружается?

Больше деталей о проблеме я испытываю: существует страница, на которой я генерирую таблицу с именами и кнопками для списка объектов, загруженных из хранилища данных. Существует EntryPoint для страницы, и в ее onModuleLoad () я делаю что-то вроде этого:

final FlexTable table = new FlexTable();

rpcAsyncService.getAllCandidates(new AsyncCallback<List<Candidate>>() {
    public void onSuccess(List<Candidate> candidates) {
       int row = 0;
       for (Candidate person : candidates) {
          table.setText(row, 0, person.getName());
          table.setWidget(row, 1, new ToggleButton("Yes"));
          table.setWidget(row, 2, new ToggleButton("No"));
          row++;
       }
    }
    ...
});

Это работает, но занимает больше чем 30 секунд для загрузки страницы кнопками для 300 кандидатов. Это недопустимо.

Приложение работает на Google App Engine и использует хранилище данных механизма приложения.

5
задан David Underhill 3 May 2010 в 14:36
поделиться

4 ответа

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

  1. FlexTable не предназначен для 300 строк. Поскольку ваша таблица настолько проста, вам следует подумать о генерации HTML вручную, а затем использовать простой виджет HTML. Кроме того, 300 строк - это много информации - подумайте об использовании пагинации. Пример приложения DynaTable показывает, как это сделать.
  2. Похоже, что вы используете один модуль GWT на страницу. Это неправильный подход к GWT. Загрузка модуля GWT имеет некоторые нетривиальные затраты. Чтобы понять, что я имею в виду, сравните обновление браузера на gmail с обновлением ссылки, которую предоставляет gmail. Это та же стоимость, которую вы платите, когда каждая страница вашего сайта имеет отдельный модуль GWT.
  3. Если список кандидатов нужен для разных представлений, вы можете отправить его вместе с HTML в виде объекта JSON, а затем использовать класс Dictionary в GWT для его чтения. Это позволит вам сэкономить на вызове RPC. Этот подход рекомендуется использовать только в том случае, если данные будут полезны для нескольких видов/экранов (например, информация о зарегистрированных пользователях)
  4. Проверьте, сколько времени занимает вызов метода RPC. Вы можете включить статистику в GWT, чтобы выяснить, на что тратит время ваше приложение.
  5. Вы также можете запустить Speed Tracer, чтобы определить, где находится узкое место. Это последнее, потому что очевидно, что FlexTable выполняет много манипуляций с DOM. В общем, если вы не знаете, с чего начать, Speed Tracer - отличный инструмент.
8
ответ дан 13 December 2019 в 19:23
поделиться

Здесь важно то, как вы получаете список кандидатов, который вы не показали. 30 секунд - это очень много, и маловероятно, что это связано только с хранилищем данных.

Вы пробовали использовать appstats для профилирования своего приложения?

1
ответ дан 13 December 2019 в 19:23
поделиться

Как Шри предложил - разбиение на страницы является самым простым и (я думаю) лучшим решением (вместе с переключением на Grid или просто

). Но если вы по какой-то причине хотели показать / отрисовать много строк одновременно, в проекте GWT Incubator есть хорошая вики-страница об этом - вместе с некоторыми тестами, показывающими, как FlexTable отстой при большом количестве строк. Посмотрите также их другие таблицы ;)

1
ответ дан 13 December 2019 в 19:23
поделиться

Ваша проблема в том, что каждый раз, когда вы добавляете что-то в FlexTable, он должен повторно отображать всю страницу и перерисовывать. Попробуйте создать новый FlexTable, заполнить его, когда он будет полностью заполнен, избавьтесь от старого и поместите туда новый.

1
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: