Recuperer resultat d'un appel RPC
Résolu/Fermé
A voir également:
- Recuperer resultat d'un appel RPC
- Comment récupérer un compte facebook piraté - Guide
- Comment recuperer un message supprimé sur whatsapp - Guide
- Appel anonyme - Guide
- Recuperer video youtube - Guide
- Récupérer photo instagram - Guide
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
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...
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 :)
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
8 nov. 2014 à 14:47
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);