Bonjour à tous,

J'ai un léger soucis avec l'aspect asynchrone des RPC sauce GWT, et je serai curieux de savoir quelle est la "bonne méthode", voilà mon problème :

Je code une petite appli type sondage avec GWT, et j'ai toutes les infos (questions, sous-questions et propositions) dans une base MySQL.
Dans mon code j'ai une fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 DisplayQuestion(int numéro de la question)
qui sert à récupérer les infos dans la base pour chaque question et les afficher.

Donc pour chaque question j'ai un service qui va chercher les sous questions dans la base, une fois que j'ai la réponse (dans le onSuccess), je fais une boucle sur les résultats renvoyés, et dans la boucle (donc pour chaque résultats) j'affiche le libellé, et j'appelle un autre service pour récupérer la liste des propositions, que j'affiche ensuite dans le onSuccess.

Grosso modo ça marche, sauf que c'est asynchrone ! Donc dans la pratique, la première sous-question s'affiche, le service pour récupérer les propositions est appelé, et hop on passe à la sous-question suivante, sans attendre que la réponse arrive, et je me retrouve avec toutes les sous-questions affichées, et ensuite seulement les propositions.

Si j'essaye d'afficher les sous-questions seulement quand les propositions arrivent dans le 2e service, j'ai droit au célèbrissime "non-final in an inner class in a different method" (un truc du genre).

Et si je crée des objets java pour chaque infos dans ma base et que j'attends d'avoir tout pour faire l'affichage, ça prend un temps fou, et du coup l'intérêt de l'asynchrone ne saute pas aux yeux.

Je colle le code au cas ou certains seraient super motivé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
if (surveyserv == null){
				surveyserv = GWT.create(SurveyDataService.class);
			}
 
			AsyncCallback<ArrayList<SurveyData>> callback = new AsyncCallback<ArrayList<SurveyData>>() {
				public void onFailure(Throwable caught) {
					Window.alert("Problem to retrieve informations");
					System.out.println("Failure du Service SurveyData (question)");
			      }
			     public void onSuccess(ArrayList<SurveyData> sousquestionlist) {
			    	 System.out.println("Success du Service SurveyData (question) :");
			    	 System.out.println(sousquestionlist.toString());
			    	 //récupérer prop par question
			    	 for (int i=0; i<sousquestionlist.size(); i++){
	 		    		 questionpropositionpanel.add(new Label(sousquestionlist.get(i).getLibelle()));
//			    		 thesurvey.setCurrentSousquestLibelle(sousquestionlist.get(i).getLibelle());
			    		 //Récupération des propositions
			    		 if (surveyserv == null){
			 				surveyserv = GWT.create(SurveyDataService.class);
			 				}
			 			AsyncCallback<ArrayList<SurveyData>> callback = new AsyncCallback<ArrayList<SurveyData>>() {
			 				public void onFailure(Throwable caught) {
			 					Window.alert("Problem to retrieve informations");
			 					System.out.println("Failure du Service SurveyData (sousquestion)");
			 			      }
			 			     public void onSuccess(ArrayList<SurveyData> propositionlist) {
			 			    	 System.out.println("Success du Service SurveyData (sousquestion) :");
			 			    	 System.out.println(propositionlist.toString());
 
//			 			    	questionpropositionpanel.add(new Label(thesurvey.getCurrentSousquestLibelle()));
			 			    	 for (int j=0; j<propositionlist.size(); j++){
			 			    		 if (propositionlist.get(j).getLibelle().equals("")){
			 			    			questionpropositionpanel.add(new Label("Oui/Non"));
			 			    		 }else{
			 			    			questionpropositionpanel.add(new Label(propositionlist.get(j).getLibelle()));
			 			    		 }	
			 			    	 }
			 			    	 mainpanel.add(questionpropositionpanel);
			 			    	 flag = true;
//			 			    	RootPanel.get("main").add(mainpanel);
			 			      }
			 			};
			 			System.out.println("GET des proposition");
			 			surveyserv.getSurveyData("proposition", sousquestionlist.get(i).getID(), callback);
 
			    	 }
			      }
			};
			System.out.println("GET des sousquestions");
			surveyserv.getSurveyData("sousquestion", num, callback);
Quelqu'un pourrait-il m'expliquer comment bien se servir des services, et comment composer avec l'aspect asynchrone des choses ?

PS : je débute avec GWT et java donc si je m'y prends comme un manche, dites le moi.