didier51 Posté(e) 29 août 2013 Share Posté(e) 29 août 2013 (modifié) Bonjour à tout les développeurs android, y aurait-il des personnes de la communauté qui pourraient m'aider? Je développe actuellement une application Android et j'ai un petit problème d'affichage. Un écran noir fait disparaître Le préload lorsque je teste la fin du téléchargement (du Thread). préload : affichage d'une petite roue qui tourne pendant le téléchargement pour faire patienter l'utilisateur. Ennoncé du problème : ******************* Dans ma classe principale, j'instancie la classe_téléchargement puis j'appelle sa méthode Web_Service. La méthode Web_Service : - Appelle à la classe Thread qui télécharge les données et les insère dans un tableau. - Teste la fin du Thread - renvoie le tableau rempli. Plan du script ************** classe principale ----------------- //Afficher le préload progressDialog.show(); //instancie la classe_telechargement Datas = new classe_telechargement(); //appelle sa méthode Web_Service (qui télécharge les données et les insère dans un tableau) et récupère le tableau. tableau = Datas.Web_Service(); //Appel la méthode "setListAdapter" qui permet d'afficher le tableau. setListAdapter(new Remplissage_List()); Méthode Web_Service dans la classe "classe_telechargement" ---------------------------------------------------------- //méthode qui fait appel à la classe Thread (qui télécharge les données et les insère dans un tableau), test la fin du Thread et renvoie le tableau. public tableau[] Web_Service() { //Appelle la classe Thread (qui télécharge les données, les insère dans un tableau) thread = new Thread(new runGetDatas()); thread.start(); //la méthode join() de la classe Thread temporise le "return" jusqu'à ce que le thread se termine. thread.join(); return tableau; } Le problème : ------------- La méthode Web_Service renvoie le tableau pour être afficher dans la classe principale. Si je ne teste pas la fin du téléchargement dans la méthode Web_Service à l'aide de la fonction "thread.join()", cela provoque une erreur. L'erreur est logique puisque La méthode Web_Service renvoie le tableau pour être afficher dans la classe principale alors qu'il n'est pas encore rempli ou que le téléchargement n'est pas terminé. Donc, dans la méthode Web_Service, il est indispensable que je teste la fin du téléchargement (de la classe du Thread) qui permet de patienter le retour du tableau pendant qu'il se rempli. Le téléchargement et le remplissage du tableau se passe bien mais le problème est que lorsque je teste la fin du Thread, un écran noir apparaît, et donc, fait disparaître le préload. Je suis ouvert à toutes critiques. Merci à ceux qui veulent bien se pencher sur ce petit problème d'affichage. Modifié 29 août 2013 par didier51 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 29 août 2013 Share Posté(e) 29 août 2013 (modifié) Tu attaques le problème de la mauvaise façon ;) En attendant la fin du thread de cette façon, tu bloques toute l'IHM de ton application, normal ensuite que l'animation ne s'affiche plus Il faut que tu dissocies le lancement du chargement en arrière-plan, de l'affichage du résultat. Pour cela, tu peux t'appuyer sur la classe AsyncTask (doc ou Javadoc), qui facilite ceci, en te permettant de spécifier ce qui doit être fait en arrière-plan (le chargement), et ce qu'il faut faire une fois que la tâche est terminée (l'affichage), sans avoir à faire d'attente active (et donc bloquante) dans le thread principal. PS: merci d'utiliser les balises [ code ] afin de rendre plus lisible ton post Modifié 29 août 2013 par chpil 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
didier51 Posté(e) 30 août 2013 Auteur Share Posté(e) 30 août 2013 Bonjour Chpil, merci de m'avoir répondu rapidement.J'ai lu avec attention tes commentaires et je vais étudier tes conseils aujourd'hui. Si tu veux, Je te tiens informé de l'évolution à mon problème.Je débute en programmation avec java sous android. je vais me pencher sur la classe AsyncTask.Mercie de tes conseils. J'espère à très bientôt pour d'autres conseils. Didier Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
didier51 Posté(e) 5 septembre 2013 Auteur Share Posté(e) 5 septembre 2013 Bonjour Chpil, voici la suite de mon problème : Après avoir réussi à faire fonctionné la classe Asyntask en récupérant mon tableau, je suis confronté au même problème que la classe Thread. Le téléchargement et le remplissage du tableau se passe bien avec un affichage d'une barre de progression (sans récupérer mon tableau en exécutant simplement la classe) : "calcul.execute();" Des que je récupère mon tableau en exécutant la classe : "tableau_objet_breves2 = calcul.execute();" un écran noir apparaît, et donc, fait disparaître la barre de progression 2° petit problème : je voud[color=red]rai[/color] faire apparaître un préload au lieu d'une barre de progression. J'ai essayé à plusieurs endroit de faire afficher le préload (dans la méthode "onCreate" de ma classe principale et dans la méthode "onPreExecute() de la classe Asyntesk) , mais sans succès, aucun préload ne s'affiche. Merci à ceux qui veulent bien se pencher sur ces petits problèmes d'affichages. Voici le code de la classe principale qui inclue la classe Asyntask (avec les explications, se sera plus claire) : public class Activite_Breves3 extends ListActivity { private ProgressBar mProgressBar; public AsyncTask<Void,Integer,Activite_breves_tableau[]> tableau_objet_breves2 = null; public ProgressDialog progressDialog; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.breves); // On récupère le composant ProgressBar de notre layout mProgressBar = (ProgressBar) findViewById(R.id.pBAsync); //Instance et Parametre progressDialog //************************************ progressDialog = new ProgressDialog(this); // On ajoute un message à notre progress dialog progressDialog.setMessage("Chargement en cours"); // Affichage du ProgressBar progressDialog.show(); //Appelle la classe Asyntask //*********************** BigCalcul_interne calcul = null; calcul = new BigCalcul_interne(); //Récupere le tableau //*********************** tableau_objet_breves2 = calcul.execute(); //Appel la methode setListAdapter afin d'aficher mon tableau setListAdapter(new Remplissage_List()); //Appel la methode qui efface le ProgressBar progressDialog.dismiss(); } //fin Oncreate() ******************************************************************************** // 2.2 Methode ListAdapter est composée de méthodes permettant de remplir la liste personnalisée ******************************************************************************** . . . ect //*************************************************************** // Classe AsyncTask //*************************************************************** private class BigCalcul_interne extends AsyncTask<Void, Integer, Activite_breves_tableau[]> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(getApplicationContext(), "Début du traitement asynchrone", Toast.LENGTH_LONG).show(); System.out.println("Début du traitement asynchrone"); // On récupère le composant ProgressBar de notre layout // mProgressBar = (ProgressBar) findViewById(R.id.pBAsync); // // //Instance et Parametre progressDialog // //************************************ // progressDialog = new ProgressDialog(this); // // On ajoute un message à notre progress dialog // progressDialog.setMessage("Chargement en cours"); // Affichage du ProgressBar // progressDialog.show(); } @Override protected void onProgressUpdate(Integer... values){ super.onProgressUpdate(values); mProgressBar.setProgress(values[0]); } @Override protected Activite_breves_tableau[] doInBackground(Void... arg0) { Activite_breves_tableau[] tableau_objet_breves = null; int progress = 0; //Templissage du tableau // . . . Ect for (progress=0;progress<=100;progress++) { for (int i=0; i<1000000; i++){} //la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate publishProgress(progress); progress++; } return tableau_objet_breves; } @Override protected void onPostExecute(Activite_breves_tableau[] result) { Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show(); System.out.println("Le traitement asynchrone est terminé"); } } } //Fin classe principale Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
didier51 Posté(e) 6 septembre 2013 Auteur Share Posté(e) 6 septembre 2013 Merci les amis, j'ai réussi à résoudre mon problème en utilisant la classe Asyntask. A bientôt pour de nouvelles aventures. Didier :P Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.