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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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