Повторяющаяся команда в gwt

Я использую гибкую таблицу, чтобы показать данные, полученные из базы данных. Когда таблица содержит большое количество столбцов, для отображения гибкой таблицы требуется много времени (я тестировал ее на таблице с 80 столбцами и 38 строками), и пока она не полностью отображается, я ничего не могу сделать со страницей. Поэтому я использую Schedule.get().scheduleIncremental(ReapitingCommand command) следующим образом:

final int  WORK_CHUNK = 2;    
Scheduler.get().scheduleIncremental(new RepeatingCommand() {
            int rowCounter = 0;

            @Override
            public boolean execute() {
            for (int i = rowCounter; i < rowCount; i++, rowCounter++) {
                for (int j = 0; j < columnCount; j++) {
                table.setText(i, j, data.get(i)[j]);
                }
                if (rowCounter % WORK_CHUNK == 0)
                return true;
            }
            return false;
            }
        });

Но если у меня есть 9 строк и 3 столбца в объекте data, он отображает только 2 строки. Как я могу улучшить его производительность, потому что, как я уже говорил ранее, если у меня 38 строк и 80 столбцов, для отображения всех данных без scheduleIncremental требуется слишком много времени. Даже в браузере всплывает окно, что скрипт, возможно, перестал отвечать.


person maks    schedule 10.12.2011    source источник
comment
Используйте CellTable, поблагодарите себя позже.   -  person Strelok    schedule 11.12.2011


Ответы (2)


Почему бы не использовать CellTable вместо FlexTable для рендеринга ваших данных?
Предполагается, что CellTable гораздо эффективнее для рендеринга больших объемов данных по сравнению с FlexTable.

person Ümit    schedule 10.12.2011
comment
потому что мне нужно только выводить данные. Мне не нужны накладные расходы кода, которые предоставляет CellTable - person maks; 10.12.2011
comment
@maks у тебя все наоборот. FlexTable имеет большие накладные расходы. С другой стороны, CellTable будет очень быстро отображать очень большое количество строк. Это также обеспечивает пейджинг с легкостью. - person Strelok; 11.12.2011
comment
Как вы можете видеть из кода в моем вопросе, я использую объект данных, который содержит данные из базы данных. Чтобы использовать CellTable, мне нужно создать TextCell‹T› для вывода данных, но его метод getValue имеет параметр объекта, который должен содержать конкретное поле для вывода его значения. Однако таких конкретных полей у меня нет. Я сохраняю данные в объекте со списком массивов, поэтому мне нужна некоторая логика итерации для их вывода. - person maks; 13.12.2011

Для приведенного выше кода я бы сделал это так. Избавьтесь от первого цикла for, потому что execute() является рекурсивным.

Scheduler.get().scheduleIncremental(new RepeatingCommand() {
    int rowCounter = 0;
    int rowCount = 10;

@Override
public boolean execute() {

// do some work
    for (int j = 0; j < columnCount; j++) {
    table.setText(i, j, data.get(i)[j]);
}

rowCounter++;

if (rowCounter >= rowCount)
    return false;

return true;
   }
});
person Tim    schedule 05.06.2013