IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Affichage du préload en exécutant 3 classes Asynctask consécutivement


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Affichage du préload en exécutant 3 classes Asynctask consécutivement
    Bonjour à tout les développeurs androïde,
    y aurait-il des personnes de la communauté qui pourraient m'aider?
    Je développe actuellement une application Androïde et j'ai un petit problème d'affichage.
    Comment faire fonctionner correctement l'affichage du préload en exécutant 3 classes Asynctask consécutivement?
    préload : affichage d'une petite roue qui tourne pendant le téléchargement pour faire patienter l'utilisateur.

    Problème d'affichage :
    --------------------
    1 - En travaillant avec une seul classe Asynctask, l'affichage du preload s'affiche correctement en début de traitement et disparaît à la fin du traitement.
    2 - En travaillant avec plusieurs classes Asynctask, l'attente des réponses aux requêtes des classes Asynctask fait que le préload s'affiche à la fin du traitement.

    Résultat attendu de mon application :
    ----------------------------------
    Pendant le téléchargement de différentes requêtes sur un serveur, afficher le préload.
    A la fin du traitement, faire disparaître le préload et afficher le résultat.

    Le traitement s’effectue en 3 étapes :
    -----------------------------------
    1 - Télécharger l'identifiant client (indispensable pour pouvoir télécharger les identifiants des articles).
    2 - Télécharger les identifiants des articles (indispensable pour pouvoir télécharger les cotations des articles).
    3 - Télécharger les cotations des articles (afin de les afficher).

    Données du problème :
    --------------------
    1 - La classe Asynctask_1 télécharge l'identifiant_client.
    2 - La classe Asynctask_2 télécharge les identifiants_des_articles.
    3 - La classe Asynctask_3 télécharge les cotisations_des_articles.

    Chronologie du programme :
    -------------------------
    - 1 - La classe mère exécute la classes Asynctask_1 et attent la réponse de celle ci (identifiant_client) pour pouvoir exécuter la classes Asynctask_2.
    - 2 - La classe mère exécute la classes Asynctask_2 et attent la réponse de celle ci (identifiants_des_articles) pour pouvoir exécuter la classes Asynctask_3.
    - 3 - La classe mère exécute la classes Asynctask_3 et attent la réponse de celle ci (cotations des articles) pour pouvoir afficher le résultat.
    - 4 - La classe mère affiche le résultat (les cotations des articles).

    Problème :
    --------
    Il y a un temps d'attente entre les différentes requêtes des classes Asynctask et la réponse.
    A partir de la 2° classe asynctask, l'attende du résultat de la requête fait que l'affichage du préload s'affiche à la fin du traitement alors qu'il devrait apparaître en début.

    Résultat de l'application :
    ----------------------
    L'application affiche bien les cotations des articles mais le préload s'affiche à la fin du traitement.

    Merci à tous ceux et celles qui pourraient m'aider à trouver une solution à ce petit problème d'affichage.

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Android, on ne dit pas Fenêtre pour Windows.

    Je te suggère de revoir ton flux d'exécution, pour le coup.

    Juste avant d'appeler ta première tâche, fait afficher ton loader.
    La dernière de tes tâches appellera une méthode de la classe appelante (donc création Interface pour ce besoin) faisant disparaître le loader.
    Ce n'est pas une bonne solution, par contre, renforçant le couplage entre la classe appelante et les AsyncTask, donc plutôt à éviter.

    Est-ce que ton interface gèle ?
    Si oui, tu as un problème plus grave, qui montrerait que tu n'utilises pas bien les AsyncTask, et dans ce cas, il nous faudrait le code.

    En lisant ça :
    Citation Envoyé par Didier_Agritechtrade
    Chronologie du programme :
    -------------------------
    - 1 - La classe mère exécute la classes Asynctask_1 et attent la réponse de celle ci (identifiant_client) pour pouvoir exécuter la classes Asynctask_2.
    - 2 - La classe mère exécute la classes Asynctask_2 et attent la réponse de celle ci (identifiants_des_articles) pour pouvoir exécuter la classes Asynctask_3.
    - 3 - La classe mère exécute la classes Asynctask_3 et attent la réponse de celle ci (cotations des articles) pour pouvoir afficher le résultat.
    - 4 - La classe mère affiche le résultat (les cotations des articles).
    je pense même que tu fais mal ces traitements. La classe mère ne doit en aucun cas attendre la fin d'un traitement, mais uniquement réagir à celui-ci.
    Pour confirmer/infirmer, il faudrait voir le code permettant de les appeler et d'attendre (s'il est à base de wait/notify, ce n'est pas bon).

    Je te suggère de tester sous Android 3.0+, tu devrais avoir une belle NetworkOnMainThreadException.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Voici la méthode onCreate() appelant les 3 classes Asynctask
    Merci Hizin pour ta réponse rapide. mais je n'est pas tout compris.
    Voici le code de la methode onCreate().
    Si cela peut d'aider à mieu comprendre mes attentes.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    public class forum  extends ListActivity {
     
    	public static String [] tableauIdArticle = new String[]{"idArticle1","idArticle2","idArticle3","idArticle4","idArticle5"};
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.cours); 
     
            	// Préload : Instance et Parametre progressDialog
    		progressDialog = new ProgressDialog(this);
     
    		//ProgressDialog progressDialog = null;
    		// Préload : On ajoute  un message à   notre progress dialog
    		progressDialog.setMessage("Chargement en cours");
     
    		// Préload : Affichage le préload
    		progressDialog.show();
     
    		// 1 - Instancier la classe "Activite_Cours_Asynctask_Identifiant"
    		// Telecharger le fichier xml contenant l'id client, le parcer et récupérer l'objet "id client"
    		ObjetRetourIdClient = new Activite_Cours_Asynctask_Identifiant(this);
    		ObjetRetourIdClient.execute();
    		//-------------------------------------------------------------------
     
    		// 1.1 - Retour du résultat du traitement Asynctask 
    		//Cela permet de récuperer sans erreur "identifiantClientApres" dans la classe "Activite_Cours"
    		try {
    			retourIdClient = ObjetRetourIdClient.get();
    		} catch (InterruptedException e1) {
    			e1.printStackTrace();
    		} catch (ExecutionException e1) {
    			e1.printStackTrace();
    		}
     
            	int indexTableauObjet = 0;
    	        int indexTableauCereals = 0;
    	        int positionSwitch;
     
    	        //Boucle balayant les 5 articles du tableau tableauIdArticle" afin de télécharger leurs cotations.
        		for(String iDArticle : tableauIdArticle){
     
    	    		// 2 - Instancier la classe Activite_Cours_Asynctask_identifiant_echeance()
    	    		//------------------------------------------------------
    		        // Telecharger le fichier xml contenant les 5 id échéances et les 5 échéances par produit,
        			// le parcer et récupérer le tableau contenant les 5 id_echeances et les 5 échéances"
    	    		ObjetRetourIdentifiantEchance = new Activite_Cours_Asynctask_identifiant_echeance(this, iDArticle, retourIdClient);
         			ObjetRetourIdentifiantEchance.execute();
         			//------------------------------------------------------------------
     
    	    		// 2.1 - Retour du résultat du traitement Asynctask 
        			//Cela permet de récuperer sans erreur "tableauIdEcheancesRetour" dans la classe "Activite_Cours"
     
        			try {
        				tableauIdEcheancesRetour = ObjetRetourIdentifiantEchance.get();
    	    		} catch (InterruptedException e1) {
        				e1.printStackTrace();
        			} catch (ExecutionException e1) {
        				e1.printStackTrace();
    	    		}
     
    			positionSwitch = -1;	//Initialisation
     
    		    	// Balayer le tableau contenant les 5 id_echeance et les 5 echeance , tableauIdEcheances contient [10]éléments
    	        	// Avec id_echeance et appelle la methode permattant de télécharger les cotations de chaque id_echeances
    		        //contenu du tableau : 0 = id_echeance1, 1 = echeance1, 2 = id_echeance2, 3 = echeance2, 4 = id_echeance3, 5 = echeance3,...
    			for(String IdEcheance : tableauIdEcheancesRetour){
     
    		    		positionSwitch++;
     
    				//positionSwitch = contenu du tableau : 0 = id_echeance1, 1 = echeance1, 2 = id_echeance2, 3 = echeance2, 4 = id_echeance3, 5 = echeance3,...
    		    		//La position du switch récupere seulement les nombres impaires contenant les id_echeances
    				switch (positionSwitch)
    				{
    				  case 0 :	
    				  case 2 :	
    				  case 4 :
    				  case 6 :
    				  case 8 :
    				  	// 3 - Instancier la classe Activite_Cours_Asynctask_Recuperation_Cotations() 
    				  	//------------------------------------------------------
    		        		// La Classe Telecharge le fichier contenant les cotations par  id echéances et le parce
    					// Le requete se fait par par l'intermédiare des idEcheances
    					ObjetAsynctaskRecuperationCotations_3 = new Activite_Cours_Asynctask_Recuperation_Cotations(this, IdEcheance, retourIdClient);
    					ObjetAsynctaskRecuperationCotations_3.execute();
    				    	//------------------------------------------------------------------
     
    					// 3.1 - Attente du résultat du traitement Asynctask 
    			    		//Cela permet de récuperer les attributs de la clase Asynctask_3 "les cotations des articles" dans la classe "Activite_Cours"
    			    		try {
    			    			ObjetAsynctaskRecuperationCotations_3.get();
    			    		} catch (InterruptedException e) {
    			    			e.printStackTrace();
    			    		} catch (ExecutionException e) {
    			    			e.printStackTrace();
    			    		}
     
    			    		//-------------------------------------------------------
    				    	// 4 - Remplissage des titres et des cotations dans le tableau objet (afin d'afficher les cotations)
    			    		//------------------------------------------------------
    				  	//Dans le "switch case", remplir le tableau avec les titres "String" aux position "indexTableauObjet++" 0:6:12:18:24,
    				  	//en Sachant que "indexTableauObjet++" est indexé avant utilisation.
    				  	//Si non, à l'exterieur du "switch case", remplir le tableau avec les cotations "objet" aux position 1:2:3:4:5, 7:8:9:10:11, ...
    			    		...
    				}//Fin switch 1		  	
    	    		}//Fin For
    		}//fin du For     de la bouble balayant le tableau des produits
     
    		// 5 - Appelle la classe "setListAdapter" afin d'afficher les cotations
    		setListAdapter(new Remplissage_List());
    		//-------------------------------------
     
    		//Faire disparaitre le préload
        		progressDialog.dismiss();
     
    	  //--------------------------
    	} //Fin de la methode onCreate 
    	  //--------------------------

  4. #4
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Yep, mauvaise utilisation des AsyncTask.

    En faisant ceci :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    retourIdClient = ObjetRetourIdClient.get();

    Tu écris explicitement : "Je gèle le thread dans lequel je me trouve, jusqu'à avoir la réponse". Pour le coup, je me demande si cela fait lever l'exception NetworkOnMainThread sur les Android 3.0+, à tester tient.

    Tu ne dois en aucun cas geler le thread graphique. Ce principe est véridique partout, quelle que soit la plate-forme, quel que soit le langage.
    Les AsyncTask ont été créées comme sucre syntaxique, pour éviter une gestion lourde de hook courant.
    La méthode doInBackground est invoquée dans un Thread en background, les méthodes onPostExecute, onPreExecute & onProgressUpdate sont invoquées dans le Thread graphique.
    Ton interface ne doit jamais attendre la fin des tâches, mais uniquement réagir aux étapes de celles-ci.

    Ici, le cas typique est la mise en place d'un pattern Observer.
    Donc :
    • crée une Interface (par exemple : "TaskListener") possédant deux méthodes onSuccess et onFailure.
    • Rajoute une variable dans tes tâches : un type "TaskListener" (initialisée via constructeur, par exemple)
    • Dans le onPostExecute, invoque onSuccess OU onFailure de ton/tes listener (dépendant de comment ça s'est passé).
    • Fait en sorte que chaque classe appelante implémente cette interface et se transmettent aux tâches
    • Fait ce qu'il faut dans les classes implémentant l'interface "TaskListener" pour bien réagir suivant le onSuccess et onFailure


    Actuellement, ton loader s'affiche en fin, et c'est tout à fait normal.
    En traduisant le flux de ton application, ça donne ça :
    • je crée et affiche mon loader
    • je crée et lance ma première tâche
    • je gèle le thread graphique en attendant explicitement le retour (donc le loader... ne s'affiche pas)
    • je crée et lance X secondes tâches
    • je gèle le thread graphique à chaque fois en attendant explicitement le retour (donc le loader... ne s'affiche pas)
    • dans la boucle créant X seconds tâches, je crée mes troisième tâche
    • je gèle le thread graphique à chaque fois en attendant explicitement le retour (donc le loader ne s'affiche toujours pas)
    • j'ai fini, j'ai la main sur le thread graphique, j'affiche le loader
    • et je le dais disparaître de suite
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Merci à nouveau Hizin pour ta réponse rapide
    J'essaie de progresser dans la programmation android.
    Je n'est pas eu l’occasion d'utiliser des Interfaces et encore moins "implémenter une classe d'une interface". Je vais étudier ces concepts et te tiendrais informer de l'évolution de mon projet.
    C'est l'occasion de progresser dans la programmation android.
    Merci encore pour ton aide.
    Didier

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut besoin d'aide
    Si un bon technicien aurai quelques bons tutos ou explication concernant les Interfaces et "implémenter une classe d'une interface", cela m'aiderai à comprendre plus rapidement, je suis preneur.
    Amicalement.
    Didier

  7. #7
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Hum, d'accord.

    Je parlais des Interface Java. Documentation : http://en.wikipedia.org/wiki/Interface_%28Java%29
    C'est une des bases du Java.

    Je ne vais pas refaire un cours complet (un trouvable ici : http://tahe.developpez.com/java/cours/ ; page 30, à priori). L'idée est ici de faire quelque chose de générique via une pseudo-classe : une interface.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 129
    Par défaut
    Pour son projet, il pourrais crée un quatrième Asynstask dans celui bien entendu le onPreExecute ( il affiche son loader ) dans le doInBackground ( il lance les 3 autres Asyntasks et dans le onPostExecute il ferme le loader.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Merci le nico_nico95
    Bonjour nico_nico95,
    merci de m'avoir répondu.
    Je ne comprend pas trop l'interet de créer un 4° Asynctask.
    J'ai fait le même script que tu me conseille de faire sur 3 Asynctask :

    Dans le 1° Asynctask, dans le onPreExecute (j'affiche mon loader ) dans le doInBackground ( je lance ma 1° procédure Asynctask et je lance les 2 autres Asyntasks et dans le onPostExecute, je ferme le loader.

    Finalement, le prelod ne s'affiche pas correctement.

    Merci de développer ton idée car je prends tout conseille qui pourrai me faire avancer dans mon projet.
    Didier.

  10. #10
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Si tu utilises toujours des get(), je dirai que c'est normal.

    Pour une aide appropriée, développe
    Citation Envoyé par Didier_Agritechtrade
    Finalement, le prelod ne s'affiche pas correctement.
    s'il te plaît
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut Réponse à M. Hizin
    Apres avoir étudié les différents concepts que vous m'avez conseillé pour résoudre mon problème d'affichage, dont l'utilisation de l’implémentation des interfaces, je ne vois pas trop l'utilité pour résoudre mon souci en implémentant ma classe principale d'une interface.

    donnée de l’énoncé :
    ------------------
    - Je travaille avec qu'une seul classe principale "ListActivity" qui contient une classe "BaseAdapter" permettant d'afficher ma liste.

    - L'affichage de la liste repose sur un tableau correctement rempli.

    - Dans le onCreate() de la classe principale, je lance les 3 classes Asynctask, je rempli le tableau des données récupérer après les 3 traitements Asynctask (télécharger les fichiers et les parcer) et je lance l'éxécution de la classe "BaseAdapter".

    Problèmes :
    ---------
    Pour remplir le tableau, je doit impérativement attendre le résultat des classes Asynctask et je doit lancer l'éxécution de la classe "BaseAdapter" dans le onCreate() de ma classe principale puisque la classe "BaseAdapter" est à l'intérieur de celle-ci.

    Demande d'aide :
    --------------
    Apres avoir pris note de vos conseil sur l'utilisation de la classe Asynctask, je doit surement mal structurer mon application.
    Pourriez vous me conseiller comment je doit m'y prendre pour structurer mon application et pourriez vous développer votre 1° idée d'implémenter ma classe d'une interface.
    Vous me conseiller que l'interface repose sur 2 méthodes : onSuccess et onFailure.
    Je suppose que ma classe principale possède ces 2 méthodes.
    Comment structurer l'application pour ne pas attendre les résultats des asynctask et remplir mon tableau.
    En sachant que je ne peux lancer l'éxécution de la classe "BaseAdapter" que dans le onCreate() de ma classe principale.
    Merci d'avance.
    ps : Merci pour le tuto que vous m'avez orienté, il est tres expliqué avec des exemple simple à comprendre.
    Didier

  12. #12
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Le plus simple, pour toi et à mon avis, sans que cela n'impacte beaucoup ton code, serait de fournir ton Activité aux tâches et d'invoquer les méthodes correspondantes.

    Ton activité lance la première tâche.
    La première tâche invoquera dans son onPreExecute une méthode displayLoader et ensuite la méthode launchSecondTask.
    La seconde tâche ne fera rien dans son onPreExecute (ou peut-être une vérification des données) et invoquer launchThirdTask dans son onPostExecute.
    Enfin, la troisième tâche ne fera rien dans son onPreExecute et invoquera hideLoader & workFinished dans son onPostExecute.

    Toutes les méthodes (displayLoadder, hideLoader, launchSecondTask, launchThirdTask et workFinished) sont des méthodes déclarées dans ton Activité principale (celle responsable de ta liste).
    Je pense que les noms sont assez explicites au niveau de leurs responsabilités et utilités, mais n'hésites pas à demander si quelque chose n'est pas clair.

    Ce n'est clairement pas solution la plus propre, mais normalement, cela devrait répondre à ton besoin.

    En bref : utiliser des callback en fin de tâche plutôt que des get synchrone (ou n'importe quelle méthode synchrone).
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  13. #13
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut affichage du preload OK
    Merci les amis, Nico95 et Hizin de m'avoir répondu et d'avoir consacré un peut de votre temps pour m'aider à résoudre le petit problème d'affichage du preload.
    Hizin, j'ai suivi tes derniers conseils.
    Vu qu'il était impératif de lancer l'affichage (classe "BaseAdapter") dans la classe principale "ListActivity", et qu'il était impératif que les résultats des classes Asynctask soient bien arrivés pour le bon remplissage du tableau qui permet d'afficher les données, j'ai donc tout mis dans la classe principale (classe "BaseAdapter", et les 3 classes Asynctask).
    J'ai travaillé dans les méthodes onPostExecute() des classes Asynctask pour récupérer les datas téléchargés puisque je ne pouvais utiliser la méthode get() qui attendait gentiment les résultats dans le onCreate().
    Au début, mon programme été bien structuré. Je travaillais avec des classes Asynctask externes.
    Depuis les modifications, le programme est beaucoup moins structuré puisque toutes mes classes secondaires se trouvent dans la classe principale mais le preload s'affiche correctement. Donc, il sera plus difficile à le maintenir si je doit le retravailler.
    Pourriez vous, si vous plait, me conseiller pour mieux structurer le programme car dans ce bas monde, j'aime bien les choses bien faites.
    Merci de votre aide.
    Amicalement.
    Didier

  14. #14
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Non, faut pas croire, je ne t'ai pas oublié

    Diagramme UML que j'ai fait rapidement :
    https://creately.com/diagram/ho5oduu...le7VAyBNISY%3D

    Au niveau de la logique :
    - tu mets en place le loader.
    - tu crées et appelles FirstTask pour débuter les chargements
    - dans FirstTask#onPostExecute, celle-ci notifie ses écouteurs (la List<TaskCallback>) de la fin du traitement.
    - SecondTask est lancé après FirstTask et avant ThirdTask
    - ThirdTask est lancé après SecondTask et clôture le chargement.

    Pour l'implémentation de onSuccess dans PrincipalActivity, j'imagine un compteur (variable d'instance) initialisé à 0. Au retour de FirstTask, la méthode incrémente le compteur (valeur de 1). Ensuite, un switch (ou un if/else/if/else) sur la valeur.
    Si le compteur vaut 1, il lance SecondTask et attend le retour.
    Si le compteur vaut 2, il lance ThirdTask et attend le retour.
    Si le compteur est supérieur à 2, il réalise l'affichage et enlève le loader.

    onFailure est là pour les problèmes réseaux, ce genre de chose.

    Notions à comprendre : http://en.wikipedia.org/wiki/Interface_%28Java%29
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut suivi du projet
    Merci Hizin de na pas avoir oublié, de m'avoir répondu et de m' avoir donné des explications à ma structure du projet.

    Je suis un ancien programmeur procédural.
    Je m'efforce de développer en orientation objet.
    Au début, mon projet était constitué de 4 classes
    - 1 - Activité principale
    - 2 - classe Asynctask 1
    - 3 - classe Asynctask 2
    - 4 - classe Asynctask 3
    Je trouvais qu'il avait une belle structure et qu'il était plus ou moins orienté objet. Mais le préload ne s'affichait pas correctement.

    Pour que le préload s'affichait correctement, j'ai été forcé de mettre les 3 classes Asynctask dans la classe principale.
    Tout mes classes et méthodes se retrouve dans une seul classe.
    Du coup, Je trouvais que mon projet est plus du tout structuré, qu'il a été développé de façon procédurale et qu'il n'est pas écrit orienté objet.

    A peine que j'ai fini ce projet que mon chef m'a déja donné un nouveau projet.
    A mes heures perdu, je m'efforcerai de recréer mon projet de façon orienté objet.
    Je vais étudier vos conseilles et si vous voulez, Monsieur_le_modérateur_développeur Hizin, je vous tiendrai informé de l'évolution du projet.
    Encore un grand merci à vous, vous m'avez beaucoup aidé pour ce projet et aussi de mon premier message "UN ÉCRAN NOIR FAIT DISPARAÎTRE LE PRÉLOAD LORSQUE JE TESTE LA FIN DU TÉLÉCHARGEMENT (DU THREAD).
    A bientôt pour de nouvelles aventures.
    Didier

  16. #16
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Pas de souci
    Passer à l'Objet après un gros passif prend du temps. J'ai l'impression que tu as la bonne logique (ou au moins le début de la logique) au vu de ton découpage initial, mais que tu manques de connaissance au niveau de la gestion multi-hread et/ou des interfaces graphiques.

    Le truc à retenir ici : ne pas geler le thread d'affichage. C'est ce qui cause ton problème. Notions d'attente active (bloquant) et passive (non-bloquant), design pattern Observer
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  17. #17
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Euh, juste comme ça, pourquoi ne pas tout simplement créer trois classes s'occupant du traitement en lui même, classes appelées dans une unique AsyncTask.

    Notions de services, tout ça, tout ça.

    Tes classes qui font les traitements en eux même ne devraient pas être des AsyncTask, mais des classes ne contenant que le métier/service.

    Elles n'ont aucunement besoin de savoir si elles s'exécutent dans un thread, une AsyncTask ou quoi que ce soit d'autre.

    Puis tu orchestres tes trois appels dans le doInBackground, puis tu caches ton indicateur de préload dans le postExecute de ton AsynkTask.

  18. #18
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Pas faux. Je crois que je suis trop resté concentré sur l'architecture suggéré x)
    Merci
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2013
    Messages : 14
    Par défaut
    Yo les amis, merci de vos réponses.
    Des que j'ai un peux de temps, je faits une 4° version de cette application en suivant vos conseils.
    Amicalement.
    A bientôt pour de nouvelles aventures.
    Didier

Discussions similaires

  1. methode pour exécuter une class dans un jar
    Par yann_p dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2006, 17h47
  2. exécuter une classe dans un jar a partir d'une methode java
    Par yann_p dans le forum API standards et tierces
    Réponses: 13
    Dernier message: 13/04/2006, 15h50
  3. Réponses: 3
    Dernier message: 27/03/2006, 11h43
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Exécuter la classe courante ??
    Par sami_c dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 17/03/2003, 17h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo