Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Utilisation d'un Thread

L'app plante

Sujet résolu
    30 juin 2012 à 22:37:40

    Rebonjour :)

    Je planche toujours sur la même application, le problème qui se présente est que : Mon application récupère des données sur un fichier XML situé sur un serveur web. Mais pendant ce temps, l'application reste sur sa page de base ( c'est à dire fond noir, titre & icon de l'application)... Pour retirer ça, j'ai donc ajouté un thread (que vous pouvez voir dans le code ci-dessous), seulement, il n'aime pas manipuler les Views ce Thread, il est un peu grincheux... Donc si vous avez une idée de comment le dompter, ce serait vraiment gentil de votre part !
    Merci d'avance :)

    public class appsActivity extends Activity {
        /** Called when the activity is first created. */
    	
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            //Suppression de la barre de titre de l'application
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            
            //Stop du strict mode
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            
            //Affichage du layout principal
            setContentView(R.layout.main);
    
            Thread t = new Thread(new Runnable() {
    
    			@Override
    			public void run() {
    				checkAndShowList();
    			}
            	
            });
            t.start();
            
        }
    
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      30 juin 2012 à 22:59:12

      Il y a la classe AsyncTask pour ça.
      • Partager sur Facebook
      • Partager sur Twitter
        30 juin 2012 à 23:10:37

        Hey !

        Ah oui, j'en ai entendu parler, je regarde actuellement la doc & co. Je suis obligé de créer une classe qui hérite de AsyncTask ? J'avais cru voir qu'on pouvait l'utiliser autrement, je me trompe ? (Surement)
        Merci en tout cas !
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          30 juin 2012 à 23:28:31

          À ce que je sache oui, tu es obligé de dériver la classe Asynctask. Voici un tuto qui m'a aidé à comprendre son principe : http://www.tutos-android.com/asynctask [...] ne-background
          • Partager sur Facebook
          • Partager sur Twitter
            30 juin 2012 à 23:36:50

            Ouais, je suis aussi sur ce tuto, mais... Avec moi ça plante, j'ai du oublier (de faire) un truc qu'il fallait (pas) et du coup...

            Voilà le début du code si ça te saute aux yeux par pur hasard... (C'est ptêtre un peu sale ou mal organisé)

            public class appsActivity extends Activity {
                /** Called when the activity is first created. */
            	
            	private LinearLayout projects;
            	
                @Override
                public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    
                    //Suppression de la barre de titre de l'application
                    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    
                    //Stop du strict mode
                    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                    StrictMode.setThreadPolicy(policy);
                    
                    //Affichage du layout principal
                    setContentView(R.layout.main);
            
                    //Création des paramètres de marge de layout pour le linearLayout principal
                    projects = (LinearLayout) findViewById(R.id.linearLayoutPrinc1);
                    
                    projectAdder Projects = new projectAdder();
                    Projects.execute();
                }
                
                private class projectAdder extends AsyncTask<Void, Integer, Void>
                {
            
            		@Override
            		protected Void doInBackground(Void... params) 
            		{
            	        projects.removeAllViews();
            	        
            	        projects.setPadding(0, 10, 0, 20);
            	        
            	        //Création des paramètres de marge de layout pour les linearLayouts de projet
            	        LinearLayout.LayoutParams parameters = new LinearLayout.LayoutParams(450, 175);
            	        parameters.setMargins(15, 10, 0, 10);
            	        
            	        //Récupération des projets
            	        ArrayList<projects> projectList = getProjectsXML();
            	        for(int i = 0;i<projectList.size();i++)
            	        {
            	        	//Ajout des projets
            	        	if (projectList.get(i) != null)
            	        	{
            	        		View project = getProject(getApplicationContext(), projectList.get(i));
            	        		Animation animation = new AlphaAnimation(0, 1);
            	                animation.setDuration(1000);
            	            	project.startAnimation(animation);
            	        		projects.addView(project, parameters);
            	        	}
            	        }
            	        return null;
            		}
            
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              30 juin 2012 à 23:54:29

              Tout ce qui modifie d'une façon ou d'une autre l'interface graphique (donc le thread principal) ne peut pas être placé dans la fonction doInBackground. Si tu veux afficher, par exemple, un texte qui indique l'état d'avancement de l'AsyncTask, tu dois écrire ton code dans la fonction onProgressUpdate. Tout ce qui est à afficher après l'exécution est à placer dans onPostExecute.
              • Partager sur Facebook
              • Partager sur Twitter
                30 juin 2012 à 23:58:44

                Donc je stocke les views des projets dans une ArrayList et je l'applique que dans onPostExecute ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  1 juillet 2012 à 0:02:52

                  Aucun code relatif aux views ou aux layouts ne doit être dans doInBackground. Dans le code de ton post précédent, tu pourrais tout mettre dans la fonction onPostExecute, non ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 juillet 2012 à 0:10:00

                    J'avais tout stocké dans un ArrayList et ensuite fait l'ajout dans le LinearLayout principal dans le post, mais ton idée est meilleure, ça économise un for() !
                    Donc merci, c'est parfait !
                    Par contre 2 petites questions :
                    1) Quand je lance l'application, j'ai toujours un écran noir avec en haut le nom de l'app et l'icone, même si avant ça durait 5-6sec à cause du chargement, maintenant ça dure juste 1min mais bon c'est que ça sert à rien d'afficher ça.
                    Donc y'a pas un moyen de le virer ? :/

                    2) J'ai mit une animation AlphaAnimation pour chaque projet qui s'affiche, le problème c'est que les animations se lancent toutes en même temps, l'animation d'apparition est un peu saccadée, je ne sais pas si c'est parce qu'il y en a 8 à afficher en même temps ou si c'est une autre raison...
                    Donc as-tu une idée pour les charger en différé ou au pire rendre l'affichage plus propre ?
                    Sinon je retirerais l'animation...


                    En tout cas merci beaucoup !
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      1 juillet 2012 à 0:18:43

                      1) Dans ton AndroidManifest.xml, pour chaque activity, ajoute android:theme="@android:style/Theme.NoTitleBar"

                      2) Pas d'idée pour ça, désolé. :/
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 juillet 2012 à 0:22:30

                        Merci :)

                        J'ai rajouté la ligne dans l'activité du Manifest et ça marche mieux, j'ai toujours l'écran noir, mais bon on s'y fera :D

                        Et pour l'effet saccadé, ça doit venir de mon téléphone aussi car je l'ai pas toujours, je vais attendre Jelly Bean et on verra bien hein :)

                        En tout cas merci beaucoup, tu m'as beaucoup aidé, et grâce à toi, j'ai enfin terminé à 100% mon application ! :)

                        Bonne nuit !
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme

                        [Android] Utilisation d'un Thread

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown