Bonjour,
J'aimerai savoir dans quel fichier et méthode dois-je appeler mes fonctions qui récupère des flux json.
J'ai besoin de ces flux avant le lancement de la première vue
Merci
Version imprimable
Bonjour,
J'aimerai savoir dans quel fichier et méthode dois-je appeler mes fonctions qui récupère des flux json.
J'ai besoin de ces flux avant le lancement de la première vue
Merci
J'utilise déjà une class pour le json(JSONParser), mon problème n'ai pas de récupérer les flux json mais de faire attendre la première vue qui à besoin de ces données.
voici mon bout de code pour le moment (je l'ai mit dans la methode onCreate de ma classe qui gère ma tabActivity):
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 final CountDownLatch latch = new CountDownLatch(2); new Thread(new Runnable(){ @Override public void run(){ // Do something JSONParser jParser = new JSONParser(); JSONObject json = jParser.getJSONFromUrl(urlCourseDuJour); System.out.println("course du jour"); Donnees allDatas = Donnees.getInstance(); try { allDatas.cdj = json.getJSONObject("coursedujour"); } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } latch.countDown(); } }).start();
mais c'est bien ton programme qui l'affiche cette "vue" ?
et avant de l'afficher, cette vue est créée (une instance de classe est créee, etc.)
donc tu peux très bien charger les données avant de la créer, ou dans le constructeur, avant de l'afficher ?
Quand tu parles de "vue", tu parles de quoi exactement ?
Une JFrame ? ou toute classe AWT/SWING du genre ?
Une classe de vue Eclipse RCP (étendant IViewPart) ou un Shell SWT ? ou tout classe SWT/JFACE du genre ?
Si tu as besoin de charger des données et que ça prend du temps,
- en swing, utilise un SwingWorker
- en swt/jface, utilise un job, ou un IRunnableWithProgress
le CountDownLatch permet quand tu utilises plusieurs threads, que certains attende le résultat d'autres pour continuer
lorsqu'on fait du l'UI en java (en swing comme en swt), on fait le traitement de l'UI sur le thread graphique. On doit éviter de bloquer le thread graphique : si on utilisais un CountDownLatch pendant une chargement de données long, toute l'application serait bloquée tant que le chargement ne serait pas terminé. C'est là qu'intervient le SwingWorker en swing : il va faire le boulot dans son thread bien tranquille sans bloquer le thread graphique et à la fin il invoque la méthode done() ou il suffit de mettre le code qui remplit l'affichage.
idem pour un Job swt ou un IRunnableWithProgress, ou dans le principe on fait un Display.getDefault().asyncExec(...) par exemple lorsqu'on a chargé les données.
je te donnerai éventuellement plus de précision lorsque tu m'auras précisé dans quel environnement graphique tu te trouves et c'est quoi ta "vue" ?
Je repasse 2 secondes au sujet du CountDownLatch...
je sais rien de l'interconnexion avec l'UI Android... mais pour le CountDownLatch, comme je le disais dans le précédent post, il sert à permettre à des threads d'attendre que des "trucs" soit terminés
lorsqu'on créé l'instance, on indique un compteur de "truc" qu'on va vouloir attendre, dans ton cas 2 (?) :
ensuite il y'a des processus qui vont produire des données et indiqueront au CountDownLatch qu'un "truc" est fait :Code:final CountDownLatch latch = new CountDownLatch(2);
et d'autres qui doivent attendre que ces trucs soient fait. pour attendre :Code:latch.countDown();
éventuellement on peut indiquer un timeout.Code:latch.await();
un CoundDownLatch tel qu'il n'y a aucun process qui "attends" ne sert à rien...
et évidement, il faut garantir qu'il y ait autant d'appel de countDown() que la valeur passée au constructeur du CountDownLatch, sinon le process qui attends risque d'attendre longtemps (sauf s'il y a un timeout, mais là il sera tout le temps en timeout).
Tous d'abord merci de ton implication.
Comme je te le dit dans le message précédent j'utilise ce bout de code dans la méthode "oncreate" de mon activity qui créer mon tabhost.
Je souhaite pour résumer charger plusieurs flux indépendamment (au moment de l'affichage de l'image de lancement de l'application)
J'utilise "CountDownLatch" car je veux que ma vue attendre que tous les flux soient récupérer pour s'afficher.
Salut,
je comprends bien ce que tu veux faire. n'ayant aucune expérience du dev sur Androïd, je ne connais pas la solution.
Mais en principe, une vue (un composant graphique) ne dois pas attendre qu'n la remplisse. On l'affiche vide ou on ne l'affiche pas. Ensuite, on charge des données et quand les données sont prêtes, on rafraîchit la vue : soit elle n'est pas encore affichée et donc on l'affiche, soit elle est affichée et donc on remplace son contenu.
Si tes données sont constituées de plusieurs sous-ensembles et que tu charges chacun des ses sous-ensembles dans un thread séparé, il est peut être justifié d'utiliser un CountDownLatch si ces données doivent être affichées sous forme compilées dans une vue unique : par exemple, on charge une liste d'éléments d'un coté, et on calcule une moyenne pour chaque élément d'autre part, et on veut absolument que chaque élément et sa moyenne soient affichés simultanément.
En java classique, swing, on peut :
- soit afficher la vue comme d'habitude, puis lancer un ou plusieurs workers avec et remplir la vue lorsque tous les workers ont terminé (en utilisant un CountDownLatch pour s'assurer que tous les résultats sont là)
- soit lancer un ou plusieurs worker, et afficher la vue remplie, dans les mêmes conditions que dans le cas précédent
En SWT, on procéderais exactement de la même manière
Je suppose que sous l'environnement Androïd on procèderait de manière similaire.
En cherchant un peu sur google, je suis tombé sur ce lien : http://madskool.wordpress.com/2010/0...ds-and-the-ui/
Est ce que ce lien ne te donnerait pas des voies à suivre ? Il semble qu'il s'agisse de différents exemple d'affichages utilisant des threads et engageant la classe Handler pour afficher les données soit au bout d'un délai, soit au bout d'un traitement long (simulé dans l'exemple par un sleep(1000).)
Merci pour tes explications. Je regarde ton lien et ce que je peux mettre en place. Je te tiens bien évidemment au courant de la solution adoptée.
Sous Android, utiliser les classes de Loader et/ou d'AsyncTask pour effectuer les chargements/opérations longues.
Cela permet de s'affranchir des classes de bas niveau (thread / handler / message).