Aller au contenu

Un écran noir fait disparaître Le préload lorsque je test la fin du téléchargement (du Thread).


didier51

Recommended Posts

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é par didier51
Lien vers le commentaire
Partager sur d’autres sites

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é par chpil
  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

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 ccool.gif

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...