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 :

Thread.sleep dans for()


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut Thread.sleep dans for()
    Bonjour,

    J'espere être a la bonne place et j'espere trouver un géni qui saura m'expliquer pourquoi cela ne fonctionne pas et quoi faire pour que ca marche.

    J'essaye de faire des pauses Thread.sleep()dans une boucle (for) pour que mon ScrollView scroll tout seul... donc faire un AutoScroll ou texte auto-défilant.

    Cela fait maintenant 2 jours que je suis bloqué, j'ai googlé presque tout ce qui est possible a ce sujet... J'ai beaucoup lu sur les Threads.sleep() mais rien n'aboutit.

    Voici mon code, je l'ai réduit au plus simple. J'utilise API 7 comme minimum SDK.

    Mon MainActivity en java, crée avec Eclipse, que j'ai nommé testsleep :
    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
    package com.example.testsleep;
     
    import com.example.testsleep.R.id;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ScrollView;
    import android.widget.TextView;
    import android.app.Activity;
     
    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);
     
    	Button Button_AutoScroll = (Button)findViewById(id.Button_AutoScroll);
    	Button_AutoScroll.setOnClickListener(new OnClickListener() {
    	    @Override
    	    public void onClick(View v) {
     
    	        TextView Text_Scrolable = (TextView) findViewById(id.Text_Scrollable);				
    	        ScrollView Scroll_Window = (ScrollView)findViewById(id.Scroll_Window);
     
    	       for (int ScrollPos = 0; ScrollPos < Text_Scrolable.getHeight();++ScrollPos)
                    {
    	            try {Thread.sleep(10000);}     ////ici ca plante 
    	            catch (InterruptedException e) {return;}
     
    		    Scroll_Window.smoothScrollTo(0, ScrollPos);										
    	        }
                }
            });
        }
    }
    Et mon fichier XML activity_main

    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
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/Layout_MainLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <ScrollView 
            android:id="@+id/Scroll_Window"
            android:layout_width="300dp"
            android:layout_height="175dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" >
     
                    <TextView
                    android:id="@+id/Text_Scrollable"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="blablablblablalblablalblabllablalblablalbla
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalblb
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalblb
                    lbalbalblbllablalblablalblablablablalblablalbalblablalbla
                    blablablalbalblablablalbalblablablalblablalblabllbalalbal
                    lblablalbbalblablablblblablablablalbbalblablbalblblalbbla
                    blablablblbalbablbalalbalbblablbalbblalblablalblalalbblbl
                    lblbalblablalblablablalblablablalbalblablablalblablablblb
                    lblablalbalblablablablablblablablalablalblablablalblablba
                    lblabllablalblablalblablalblalblablalblalblblablalblalbl"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#673F18" />
     
        </ScrollView>
     
        <Button
            android:id="@+id/Button_AutoScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:text="AutoScroll" />
     
    </RelativeLayout>
    Quand je met la portion[try {Thread.sleep(10000);} catch (InterruptedException e {return;}] dans la boucle for ca plante. Comme si il compilait le Thread.sleep() un par dessus l'autre sans l'executer et faire une pause comme prévu et sature la mémoire. Pourtant c'est ce que je vois partout sur le net pour faire une pause dans un for.

    Quand je mets ces 2 lignes en dehors de la boucle for... avant ou apres... il fait une pause de 10 sec avant d'effectuer la boucle for d'un coup. Mais rien a faire dans la boucle.

    Est-ce qu'il y a de quoi que j'ai mal compris a propos des Threads...

    merci a'avance pour votre aide...

  2. #2
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Points : 58
    Points
    58
    Par défaut
    Salut,

    As-tu essayé de commenter la boucle ?

    Break a la place de return ?

    Tu as le logcat ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Merci
    J'ai essayer break aulieu de return, cela me donne un message d'erreur encore mais si je fais attendre aulieu de forcer le redemarage sa debogue... mais il ne fait toujours pas de pause entre chaque boucle.

    Que veut tu dire pas commenter la boucle...
    Et oui j'ai le logCat mais c'est encore du chinois pour moi.

    Autre suggestion, le code est toute la pour l'essayer vite fait... j'ai même mis le XML pour que ca ce test vite.

    p.s. Ca fait a peine 2 sem que j'apprend le java. J'ai une tres forte base en VB, j'ai fait quelques petits jeux, surtout des jeux de table mais la je veux faire des app pour Android. Je sais que je ne suis pas au bout de mes peines mais j'apprend tres vite. SVP aidez moi avec ce mystere de comment ralentir la boucle for.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Points : 58
    Points
    58
    Par défaut
    Essaie de faire executer ton sleep hors de la boucle. Commente la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int ScrollPos = 0; ScrollPos < Text_Scrolable.getHeight();++ScrollPos)
                    {
    et pour vérifier que l'erreur soit encore la

    Affiche le logcat pour qu'on puisse vérifier les causes de l'erreur.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Ca fontionne tres bien hors de la boucle.... aucune erreur.... le programme prend une pause de 10 sec et execute la boucle d'un seul coup, donc aulieu de dessendre tranquillement il va directement a la fin... comme Home/End

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try {Thread.sleep(10000);} 
    catch (InterruptedException e) {break;}
     
    for (int ScrollPos = 0; ScrollPos < Text_Scrolable.getHeight();++ScrollPos){
     
    	//try {Thread.sleep(10000);} 
    	//catch (InterruptedException e) {break;}
     
    	Scroll_Window.smoothScrollTo(0, ScrollPos);										
    }

    je vois dans le logCat

    WindowManager WIN DEATH: Windows{49e20888 com.exemple.....
    eep.MainActivity paused=false}

    Quand je le met dans la boucle voici ce que le logCat renvoie
    threadid=7: reacting to signal 3
    Wrote stack trace to !/data/anr/traces.txt'

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Ok désolé du délais j'ai explorer un peu le logcat...

    J'ai effacer le logcat et afficher seulement les erreurs

    ... j'ai ces 2 erreurs au chargement du programme que je mette le code Tread.sleep() ou non.....mmmmm

    E/AndroidRuntime(775): ERROR: thread attach failed
    E/AndroidRuntime(786): ERROR: thread attach failed


    ...Quand je click sur mon bouton qui active la boucle for avec le sleep a l'intérieur il me renvoi ceci comme erreur en cliquant sur le bouton forcer le redémarage

    E/JavaBinder(51): !!! FAILED BINDER TRANSACTION !!!
    E/gralloc(51): [unregister] handle 0x507050 still locked (state=40000001)

    est-ce que ca aide???
    sinon j'ai pas compris ce que tu voulais dire commenter la ligne.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Je viens de reussir apres plus de 2 jours a chercher.... si jamais ca interesse quelqu'un


    Code Java : 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
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
     
        final ScrollView Scroll_Story = (ScrollView)findViewById(id.Scroll_Story);
        final TextView Text_Story = (TextView)findViewById(id.Text_Story);
     
        for (int ScrollPos = 0 ; ScrollPos < Text_Story .getHeight();++ScrollPos) {
        final int ScrollValue = ScrollPos;
     
    			              try {Thread.sleep(50);} 
    						  catch (InterruptedException e) {return;}
     
    			    		  Scroll_Story.post(new Runnable() {
     
    			    			  @Override
    			    			  public void run() {
    			    				  Scroll_Story.smoothScrollTo(0, ScrollValue);
    			    			  }
    			              });
    			          }
    			      }
     
    			   };
     
    			    new Thread(runnable).start();
    		    }

  8. #8
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Ce n'est pas une bonne idée à mon avis.

    Quelle était l'erreur dans le LogCat ? Si ton application plante, il y en a obligatoirement une, et c'est surtout celle-ci qui est intéressante.

    Avais-tu utilisé Scroll_Story.setSmoothScroll(true); ?

    Ps : convention Java :
    • variables en lowerCamelCase, underscore prohibé (Scroll_Story => scrollStory)
    • classe en UpperCamelCase, toujours pas d'undescore
    • Constantes en MAJUSCULE_AVEC_UNDERSCORE_POUR_SEPARATEUR


    Tout bonnement plus facile pour s'y retrouver et ne pas avoir de surprise vis-à-vis des choses non déclarées dans l'extrait que tu utilises.
    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

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Elle ne plantait pas. Il avait mis un sleep de 10 seconde dans une boucle déclenchée par le thread graphique. Il gelait juste son affichage jusqu'à ce que le boucle soit terminée. D'ou la solution de passer par un thread séparé pour faire l'animation

  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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Euh, t'es sûr ?
    Citation Envoyé par JackDannyL
    Quand je met la portion[try {Thread.sleep(10000);} catch (InterruptedException e {return;}] dans la boucle for ca plante.


    Outre le fait de geler l'affichage, je pense que l'exception qu'il avait était parlante, avec un message type "L'affichage ne peut être mis à jour que dans le Thread principal".
    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
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JackDannyL Voir le message


    ...Quand je click sur mon bouton qui active la boucle for avec le sleep a l'intérieur il me renvoi ceci comme erreur en cliquant sur le bouton forcer le redémarage
    Je suppose que le bouton de redémarrage est accompagné d'un message "l'application ne répond plus"

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    1- Merci Hizin pour l'info sur les conventions, je viens juste de lire ladessu lol, je vais y porter attention.

    2 - Tout a fait tchize_, j'essayais de faire défiler mon text dans le thread graphique... de IMH si j'ai bien compris.

    J'essaye encore de maitriser les threds, j'essaye de réduire au maximum le code. J'y arrive presque... mon thread faits des calculs sans probleme mais lorsque j'essaye d'afficher le résultat dans un TextView ca plante. Mais ce que je comprend pas c'est que avant de planter ca affiche dans le TextView 1,2 et ca plante.

    Voici mon code pour tester les handlers... un petit conteur de 1 a 100 tout les 1 seconde.

    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
    int countValue = 0;
    TextView textCount;
    Thread autoCountThread;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.activity_main);
    	textCount = (TextView)findViewById(id.text);
     
    	AutoCount ();
        }
     
        public void AutoCount (){
    	Thread autoCountThread = new Thread(new Runnable() {
    	    @Override
    	    public void run() {
    		try {
    		    for (int countLoop = 0; countLoop < 100; ++countLoop){
    		    countValue = ++countValue;
                        //Je n'arrive pas a afficher... apres 2 ca plante
                        //textCount.setText(String.valueOf(countValue));
    		    Thread.sleep(1000);
    		    }
    		}
    		catch (InterruptedException e) {return;}		
    	    }
    	});
            autoCountThread.start();
        }
    mais si j'ajoute un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void testclick(View view){
        textCount.setText(String.valueOf(countValue));
    }
    ca affiche bien le résultat changant chaque sec

    Et le logcat me donne

    threadid=15: thread exiting with uncaught exception (group=0x4001b188)
    Uncaught handler: thread Thread-8 exiting due to uncaught exception

    android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
    at android.view.ViewRoot.requestLayout(ViewRoot.java:557)
    at android.view.View.requestLayout(View.java:7918)
    ...
    at android.widget.TextView.setText(TextView.java:2527)
    at com.example.mytest.MainActivity$1.run(MainActivity.java:37)
    at java.lang.Thread.run(Thread.java:1096)

    1 - si je comprend bien on ne peut pas toucher a une vue dans un nouveau thread??

    2 - Y a t-il un facon de pouvoir modifier les vues dans un autre thread?

    3 - Faut-il passer par un handler? si oui comme faire le plus simplement?


    Merci

  13. #13
    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 : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Je suspectais cette exception

    1) Seul le thread graphique peut modifier les vues.

    2) Au sens strict, non. Par contre, il est possible de demander gentiment au thread graphique qu'il doit passer un bout de code. Ca passe par la méthode Activity#runOnUiThread(Runnable)

    3) C'est plus ou moins ce que fait runOnUiThread.
    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

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2014
    Messages : 39
    Points : 25
    Points
    25
    Par défaut
    Merci a tous

    Wow enfin... et voila comment géré le temps pour le calcul et l'interface graphique grace aux thread. On est loin du Sleep de VisualBasic

    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
    TextView textCount;
    int countValue = 0;
     
    public void AutoCount (){
     
        textCount = (TextView)findViewById(id.text);			
        Thread autoCountThread = new Thread(new Runnable() {
    	 @Override
    	 public void run() {
    	      try {
    	          for (int countLoop = 0; countLoop < 100; ++countLoop){
    		      countValue = countValue + 1;
    		      Thread.sleep(1000);
     
    		      runOnUiThread(new Runnable() {
    		          @Override
    		          public void run() {
    		              textCount.setText(String.valueOf(countValue));
    		          }
    		      });
    		  }
    	     }
    	     catch (InterruptedException e) {return;}	
            }
        });
        autoCountThread.start();
    }
    Reste juste a l'appeller AutoCount (); dans OnCreate ou dans un boutton...
    J'espère que code en aidera d'autre...

    Petite question... AutoCount() c'est bien un méthode que je viens de créé??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Thread sleep dans une boucle
    Par Sharcoux dans le forum Général Java
    Réponses: 7
    Dernier message: 17/03/2013, 19h29
  2. ce que fait sleep dans un thread
    Par ikuzar dans le forum Débuter
    Réponses: 2
    Dernier message: 26/08/2009, 09h00
  3. [Thread] PB Thread.sleep(1000) marche pas
    Par kliel dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 03/12/2004, 13h47
  4. [Thread]sleep()
    Par jokoss dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 03/07/2004, 14h33
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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