Recuperer resultat d'un appel RPC

Résolu/Fermé
ifr38 - Modifié par baladur13 le 8/11/2014 à 11:16
 ifr38 - 8 nov. 2014 à 18:07
Bonjour,

Cela fait deux heures que je suis bloqué et jai besoin de votre aide..

Je souhaite recuperer mon resultat de l'appel au service (result) donc je fais comme ceci :

ModifierT.this.enregService.getTrolls(new AsyncCallback<ArrayList<String>>() {
    public void onFailure(Throwable caught) {
     System.out.println("non");
    }
    public void onSuccess(ArrayList<String>result) {
     System.out.println("ok");
     for (int i = 0; i < result.size() ; i ++)
     {
      tmp.add(result.get(i));
     }
     
    }
   });


Si je fais un System.out.println(result.get(i)) jai bien mon resultat attendu, alors que si je fais System.out.println(tmp.get(i)) par la suite mon tableau est vide..

D'où cela peut venir? merci d'avance :)



2 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 nov. 2014 à 12:52
Bonjour,

C'est un peu court comme code pour comprendre tout ce que tu fais, mais en supposant que ce soit un problème courant, je dirais que vu que ton appel est asynchrone, lorsque tu affiches tmp.get(i) de manière synchrone il est encore vide, en l'occurrence l'affichage "ok" n'a pas eu lieu.

Autre source d'erreur, mais là ça t'aurais provoqué une exception, vu qu'il y a concurrence entre la lecture et l'écriture de tmp, il va falloir lui donner un type qui supporte la concurrence (CopyOnWriteArrayList par exemple), mais avec ton code on ne sait pas quel type a tmp...
0
Merci de ta réponse KX,
Voici un peu plus de code :


private ArrayList<String> listeTrolls = new ArrayList<String>();
ModifierT() {

listeTrolls.add("lol");

ModifierT.this.enregService.getTrolls(new AsyncCallback<ArrayList<String>>() {
public void onFailure(Throwable caught) {
System.out.println("non");
}
public void onSuccess(ArrayList<String>result) {
System.out.println("ok");
for (int i = 0; i < result.size() ; i ++)
{
System.out.println(result.get(i));
listeTrolls.add(result.get(i));
}

}
});

String[] test = new String[]{ "apple", "ape", "anything", "else"};

for (int i = 0; i < test.length ; i ++)
{System.out.println(test[i]);}

for (int i = 0; i < listeTrolls.size() ; i ++)
{System.out.println(listeTrolls.get(i));}


Je suis donc dans le constructeur de mon Composite, listeTrolls est un arrayList<String> ..
Si je fais un println(listeTrolls) jai bien mon "lol" qui s'affiche ainsi que mon "ok",puis les variables de mon tableau test, mais rien pour le reste du contenu de listeTrolls qui est censé contenir le result de l'appel de mon service!
Si comme tu le dis cela provient d'un probleme d'appel asynchrone, sais-tu comment résoudre le probleme?

Encore un graaaand merci en tous cas :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 nov. 2014 à 14:47
ModifierT.this.enregService.getTrolls
c'est particuliuèrement moche, tu peux faire directement
enregService.getTrolls
, sous réserve que
enregService
soit bien initialisé ce que rien ne garantit ici.
En plus, pareil, on ne sait pas ce qu'est
enregService
, mais un get qui prends des arguments c'est bizarre, tu devrais plutôt avoir un
getTrolls().setCallback(...)
par exemple.

Pour en revenir au problème, tu fais tout dans le constructeur, alors que c'est typiquement l'endroit où l'on ne devrait jamais rien faire d'autre que des initialisations.
Pour voir ce qu'il se passe je te conseilles de mettre un affichage à la fin de ton onSuccess, mais vu comment c'est fait, ton callback n'a aucune raison d'être appelé vu que enregService n'est pas sollicité entre le moment où tu définis le callback et le moment où tu lis listeTrolls.

Sinon il faut se méfier des ArrayList avec la concurrence, dans ton cas ça devrait plutôt bien se passer, mais dans l'absolu c'est dangereux, car rien ne garantit entre le moment où tu fais listeTrolls.size() et listeTrolls.get(i) que la listeTrolls n'a pas pu être modifié par un autre Thread, par exemple avec un listTrolls.clear() ou un listTrolls.remove(i);
0
Merci a toi, mon probleme est résolu, une faute de frappe qui me fesait appeler une variable initialisée mais vide, c'est pourquoi mon ArrayList ne se remplissait pas ...
Mais ton intervention m'a quand meme bien servi pour comprendre un peu mieux deux trois choses ;)
0