0

こんにちは、私は gwt プログラミングの初心者で、この AsyncCallback の問題を解決しました。コードは次のようになります。

しかし、このメソッドを呼び出すと、コールバックがリストを作成する前にリストが返されます。

`public static ArrayList<Appointment> build(Usuario user,AppointmentStyle[] styles) {
        final ArrayList<Appointment> list = new ArrayList<Appointment>();
        callback = new AsyncCallback<List<Compromisso>>() {

            @Override
            public void onFailure(Throwable caught) {
                MessageBox.alert("Erro", "Contate o administrador", null);

            }

            @Override
            public void onSuccess(List<Compromisso> result) {
                compromissos = result;
            }

        };
        getServico().listCompromisso(user, callback);


        for (int i = 0; i < compromissos.size(); i++) {
            Date now = new Date();
            now.setDate(compromissos.get(i).getData().getDate());

            Date start = (Date) now.clone();
            int hour = compromissos.get(i).getHorai().getHours();
            int min = compromissos.get(i).getHorai().getMinutes();
            start.setHours(hour);
            start.setMinutes(min);

            Date end = (Date) now.clone();
            end.setHours(compromissos.get(i).getHoraf().getHours());
            end.setMinutes(compromissos.get(i).getHoraf().getMinutes());

            Appointment appt = new Appointment();
            appt.setStart(compromissos.get(i).getHorai());
            appt.setEnd(compromissos.get(i).getHoraf());

            if (compromissos.get(i).getPrivacidade().getCodigo() == "1") {
                appt.setTitle(compromissos.get(i).getTitulo());
                appt.setDescription(compromissos.get(i).getNota());
            } else if (compromissos.get(i).getPrivacidade().getCodigo() == "2") {
                appt.setTitle(compromissos.get(i).getTitulo());
                appt.setDescription("Dados n&atilde;o disponiveis.");
            } else {

                appt.setTitle("Ocupado");
                appt.setDescription("Dados n&atilde;o disponiveis.");
                appt.setStyle(AppointmentStyle.GREY);
            }
            if (compromissos.get(i).getPrioridade().getCodigo() == "1") {
                appt.setStyle(AppointmentStyle.RED);
            } else if (compromissos.get(i).getPrioridade().getCodigo() == "2") {
                appt.setStyle(AppointmentStyle.GREEN);
            } else if (compromissos.get(i).getPrioridade().getCodigo() == "3") {
                appt.setStyle(AppointmentStyle.GREEN);
            }
            list.add(appt);
        }

        return list;
    }`

私は何をすべきか ?

4

2 に答える 2

0

リクエストを非同期で処理する必要があります。問題はgetServico().listCompromisso(user, callback);、サーバーの応答を待たないことです。

onSuccess 内でリスト処理を呼び出し、UI を更新します。

public static void updateModel (Usuario user,AppointmentStyle[] styles) { 
    final ArrayList list = new ArrayList();
    callback = new AsyncCallback>() {

        @Override
        public void onFailure(Throwable caught) {
            MessageBox.alert("Erro", "Contate o administrador", null);

        }

        @Override
        public void onSuccess(List<Compromisso> result) {
            compromissos = result;
            processResult();
            updateUi(); //TODO update your App(-UI)
        }

    };
    getServico().listCompromisso(user, callback);
 }

 /* I don't read all this stuff */
 processResult(){
     for (int i = 0; i < compromissos.size(); i++) {
        Date now = new Date();
        now.setDate(compromissos.get(i).getData().getDate());

        Date start = (Date) now.clone();
        int hour = compromissos.get(i).getHorai().getHours();
        int min = compromissos.get(i).getHorai().getMinutes();
        start.setHours(hour);
        start.setMinutes(min);

        Date end = (Date) now.clone();
        end.setHours(compromissos.get(i).getHoraf().getHours());
        end.setMinutes(compromissos.get(i).getHoraf().getMinutes());

        Appointment appt = new Appointment();
        appt.setStart(compromissos.get(i).getHorai());
        appt.setEnd(compromissos.get(i).getHoraf());

        if (compromissos.get(i).getPrivacidade().getCodigo() == "1") {
            appt.setTitle(compromissos.get(i).getTitulo());
            appt.setDescription(compromissos.get(i).getNota());
        } else if (compromissos.get(i).getPrivacidade().getCodigo() == "2") {
            appt.setTitle(compromissos.get(i).getTitulo());
            appt.setDescription("Dados n&atilde;o disponiveis.");
        } else {

            appt.setTitle("Ocupado");
            appt.setDescription("Dados n&atilde;o disponiveis.");
            appt.setStyle(AppointmentStyle.GREY);
        }
        if (compromissos.get(i).getPrioridade().getCodigo() == "1") {
            appt.setStyle(AppointmentStyle.RED);
        } else if (compromissos.get(i).getPrioridade().getCodigo() == "2") {
            appt.setStyle(AppointmentStyle.GREEN);
        } else if (compromissos.get(i).getPrioridade().getCodigo() == "3") {
            appt.setStyle(AppointmentStyle.GREEN);
        }
        list.add(appt);
    }
}

編集:

GWT ドキュメントで、非同期リモート サーバー通信に関する優れたチュートリアルを見つけることができます。

于 2012-07-18T23:25:32.333 に答える
0

DB thx から all にすでにロードされているアイテムをメソッドに送信する問題を解決しました。

于 2012-07-26T13:45:36.260 に答える