Recuperer resultat d'un appel RPC
Résolu
ifr38
-
ifr38 -
ifr38 -
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 :
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 :)
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 :)
A voir également:
- Recuperer resultat d'un appel RPC
- Comment recuperer un message supprimé sur whatsapp - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Appel privé - Guide
- Resultat foot - Télécharger - Vie quotidienne
- Comment récupérer un compte facebook piraté - Guide
2 réponses
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...
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...
Merci de ta réponse KX,
Voici un peu plus de code :
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 :)
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 :)
ModifierT.this.enregService.getTrollsc'est particuliuèrement moche, tu peux faire directement
enregService.getTrolls, sous réserve que
enregServicesoit 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);