Фундаментальное непонимание асинхронного вызова GWT

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

Я создал два интерфейса, а также реализацию, и они, кажется, общаются друг с другом. Я делаю это заявление на основе разумно выглядящих данных, наблюдаемых при выполнении отладчика eclipse: переменная result в методе onSuccess ниже содержит то, что я ожидаю, и сетка, которую я пытаюсь заполнить, в конечном итоге заполняется данными из results при выходе из цикла. Однако, когда вызов onSuccess возвращается, в моем графическом интерфейсе не отображается сетка в соответствии с вызовом uhpScrollPanel.setWidget(uhpGrid), и никакие исключения не выдаются.

Я, должно быть, упускаю из виду что-то очевидное, у кого-нибудь есть идеи о том, где искать?

    final ScrollPanel uhpScrollPanel = new ScrollPanel();
    uhpVert.add(uhpScrollPanel);
    uhpScrollPanel.setSize("100%", "100%");


    //build and populate grid
    UpdateHistoryServiceAsync uhpService = UpdateHistoryService.Util.getInstance();

    uhpService.getUpdateHistory(new AsyncCallback<List<UpdateHistoryEntryBean>>() {

        public void onFailure(Throwable caught) {
            System.out.println("OnFailure");
            caught.printStackTrace();

            final Label uhpErrorLabel = new Label("Server Unable to Grab History...");
            uhpScrollPanel.setWidget(uhpErrorLabel);
            uhpErrorLabel.setSize("100%", "100%");

        }

        public void onSuccess(List<UpdateHistoryEntryBean> result) {
            int length = result.size();

            final Grid uhpGrid = new Grid();
            uhpScrollPanel.setWidget(uhpGrid);
            uhpGrid.setBorderWidth(1);
            uhpGrid.setSize("100%", "100%");
            uhpGrid.resize(length, 3);

            int i = 0;
            for (UpdateHistoryEntryBean entry : result) {
                uhpGrid.setText(i, 0, String.valueOf(entry.getSourceId()));
                uhpGrid.setText(i, 1, entry.getTitle());
                uhpGrid.setText(i, 2, entry.getBody());
                i++;
            }
        }

    });

gwt
person Brian Sweeney    schedule 11.02.2009    source источник


Ответы (2)


Ваш метод onSuccess() определен неправильно, в качестве параметра он получает Object, и впоследствии вы должны его понизить.

То есть подпись должна быть:

public void onSuccess(Object result)

После этого вы можете явно понизить объект, который, как вы знаете, вы получили обратно, например:

List<UpdateHistoryEntryBean> resultList = (List<UpdateHistoryEntryBean>) result;
person Yuval Adam    schedule 11.02.2009
comment
Юваль, ты уверен? Я использую GWT 1.5 и Java 1.5 — полная поддержка дженериков. Этот сигнал метода был сгенерирован с помощью поддержки инструментов (GWTDesigner, если быть точным...). В любом случае ожидаемые данные появляются в моей переменной результата, поэтому я думаю, что это не проблема. Спасибо за попытку! - person Brian Sweeney; 12.02.2009
comment
В данном случае это не ответ, но все же полезная проверка работоспособности для тех, кто использует GWT 1.4, но по ошибке компилирует правила 1.5 с помощью какого-либо инструмента. - person Brian Sweeney; 12.02.2009

Что ж, получается, что быстрое решение состоит в том, чтобы добавить сетку в VerticalPanel, а не в ScrollPanel. Теперь возникает вопрос: почему это должно иметь значение и как нам обойти эту дилемму?

person Brian Sweeney    schedule 11.02.2009
comment
Я думаю, вам нужно опубликовать это как отдельный вопрос, так как он больше не имеет ничего общего с заголовком вашего вопроса. - person rustyshelf; 12.02.2009