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 :

Problème affichage UI et thread en cours


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut Problème affichage UI et thread en cours
    bonjour à tous,

    Voici ce que j'essaie de faire :

    J'affiche à l'écran dans un textview " attente connexion client..."
    Puis mon code lance un scan au travers de la lecture d'un fichier tableau (proc/net/arp)..
    Quand l'ip que j'attends est connectée..la boucle qui qui lit ce fichier dans un thread s’arrête et je démarre un thread UpdateUITHread pour afficher dans le même textview : "Client connecté ip..."
    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
    public class ClientConnecte extends Activity {
    TextView textView1;
    private String ipAdresse ;
    private String ipLegitime = "192.168.0.20";
    int exact = 1;
     
    	public void onCreate(Bundle savedInstanceState) {
     	super.onCreate(savedInstanceState);
     	setContentView(R.layout.connexion);
     	textView1=(TextView)findViewById(R.id.textView1);
            //j'affiche  le message suivant dans un textview et je lance un scan dans un thread
     	textView1.setText("Attente connexion Client"+"\n"+" "+"Démarrez le client");
    	new Thread(new ScanThread()).start();
    	// du code...
    	}
     
    class Scan {
    //ici je parcours un fichier tableau du systeme /proc/net/arp et j'en extrait entre autre la valeur
    // de ipAdresse
    }
     
    class ScanThread implements Runnable {	
    	Scan mScan;
    	UpdateUIThread updateUIThread;
     
    	//tant que je n'ai pas l'ipAdresse connectée attendue (ipLegitime) je parcours en boucle 
    	//avec ma class Scan
    	public void run(){
    		Scan mScan = new Scan();		
    		while (exact !=0){			
    		ArrayList<ClientScanResult> Clients = mScan.getClientList(false);		
    		for (ClientScanResult clientScanResult : Clients) {		
    			ipAdresse = (clientScanResult.getIpAddr().toString());
    		        exact = (ipAdresse.compareTo(ipLegitime));
    		   }	
    		}
                        //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    		    UpdateUIThread updateUIThread = new UpdateUIThread();
    		    new Thread(updateUIThread).start();	   
    	}
     
    class UpdateUIThread implements Runnable {
    	String msg = ("CLIENT CONNECTE :" + ipAdresse);
    @Override
    public void run() {
            //ça coince ici...
    	textView1.setText(textView1.getText().toString()+ msg );
    	}
     
          }
     
    }
    Tout roule jusqu'à l'affichage du message résultat
    debug :
    Thread [<15> Thread-3740] (Suspended (exception ViewRootImpl$CalledFromWrongThreadException))
    <VM does not provide monitor information>
    ViewRootImpl.checkThread() line: 4746
    ViewRootImpl.requestLayout() line: 823
    PhoneWindow$DecorView(View).requestLayout() line: 15473
    LinearLayout(View).requestLayout() line: 15473
    FrameLayout(View).requestLayout() line: 15473
    RelativeLayout(View).requestLayout() line: 15473
    RelativeLayout.requestLayout() line: 318
    TextView(View).requestLayout() line: 15473
    TextView.checkForRelayout() line: 6452
    TextView.setText(CharSequence, TextView$BufferType, boolean, int) line: 3696
    TextView.setText(CharSequence, TextView$BufferType) line: 3554
    TextView.setText(CharSequence) line: 3529
    SelectFile$UpdateUIThread.run() line: 283
    Thread.run() line: 856
    Je n'arrive pas à comprendre pourquoi...

    Merci pour vos suggestions..

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Tes threads ne sont pas synchronisés entre eux. Essayes plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    UpdateUIThread updateUIThread = new UpdateUIThread();
    this.runOnUiThread(updateUIThread);
    Regarde aussi les cours et tutoriels de formation pour apprendre la programmation Android : http://android.developpez.com/cours/
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Merci Hephaistos007,

    J'appréhende à peine la notion de thread..je débute..

    Donc cette notion de synchro des deux threads n'est pas claire pour moi.

    Le Thread ScanThread lance lui même l'UpdateUIThread...Ou rentre en en ligne de compte la synchro des threads et l'affichage de l'UI?

    Dans ScanThread j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UpdateUIThread updateUIThread = new UpdateUIThread();
    		    this.runOnUiThread(updateUIThread);
    Eclipse me demande de créer une méthode runOnUiThread dans la classe ScanThread?

    J'ai un peu du mal, d'autant que this reste très mystérieux pour moi dans sa signification!

    J'ai encore du chemin!

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Pour que ça fonctionne j'ai donc fait ceci:

    Dans la classe ScanThread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    runOnUiThread(new Runnable() {
     
                    @Override
                    public void run() {
     
                        textView1.setText(null);
                        textView1.setText(textView1.getText().toString() + "CLIENT CONNECTE :" + ipAdresse + "\n" + " " + "\n" + "Sélectionnez vos fichiers" );
     
                    }
     
    		    });
    Plus évident pour moi

    Si une âme charitable voulait me faire un petit tour d'horizon sur this...ce serait pas de refus.
    Parceque tout ce que j'ai lu jusqu'à maintenant ne me fait pas tilt!!

    merci.

  5. #5
    Membre du Club Avatar de kanaziwok
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 105
    Points : 52
    Points
    52
    Par défaut
    this représente l'objet dans le quel tu te situes.

    il te permet d'accéder à toutes les méthodes que l'objet possède. Il n'est pas obligatoire de l'utiliser. Mais peut être utile dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class A{
     
    private String value;
     
    public A(String value) {
    this.value = value; // permet de distinguer le value passé en paramètre et celui de la classe
    }
     
    public String getValue(){
    return value; // même chose que return this.value;
    }
     
    }
    Voilà ce que je sais sur this ^^

  6. #6
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    runOnUiThread est une méthode de la classe Activity. A toi de faire la modif en conséquence.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    artisan
    Inscrit en
    Octobre 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : artisan
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2013
    Messages : 47
    Points : 30
    Points
    30
    Par défaut
    Dans ce cas :
    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
    public class ClientConnecte extends Activity {
    TextView textView1;
    private String ipAdresse ;
    private String ipLegitime = "192.168.0.20";
    int exact = 1;
     
    	public void onCreate(Bundle savedInstanceState) {
     	super.onCreate(savedInstanceState);
     	setContentView(R.layout.connexion);
     	textView1=(TextView)findViewById(R.id.textView1);
            //j'affiche  le message suivant dans un textview et je lance un scan dans un thread
     	textView1.setText("Attente connexion Client"+"\n"+" "+"Démarrez le client");
    	new Thread(new ScanThread()).start();
    	// du code...
    	}
     
    class Scan {
    //ici je parcours un fichier tableau du systeme /proc/net/arp et j'en extrait entre autre la valeur
    // de ipAdresse
    }
     
    class ScanThread implements Runnable {	
    	Scan mScan;
     	//tant que je n'ai pas l'ipAdresse connectée attendue (ipLegitime) je parcours en boucle 
    	//avec ma class Scan
    	public void run(){
    		Scan mScan = new Scan();		
    		while (exact !=0){			
    		ArrayList<ClientScanResult> Clients = mScan.getClientList(false);		
    		for (ClientScanResult clientScanResult : Clients) {		
    			ipAdresse = (clientScanResult.getIpAddr().toString());
    		        exact = (ipAdresse.compareTo(ipLegitime));
    		   }	
    		}
                        //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    		    runOnUiThread(new Runnable() {
     
                  		  @Override
                  		  public void run() {
     
                       	 textView1.setText(null);
                       	 textView1.setText(textView1.getText().toString() + "CLIENT CONNECTE :" + ipAdresse  );
     
                    }  
    	   }
     
    	}
     
    }
    runOnUiThread est une méthode de ScanThread ? non?

    Dans ce que tu me proposes, runOnUiThread doit être une méthode de ma classe principale ClientConnecte mais lancé dans ScanThread?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    UpdateUIThread updateUIThread = new UpdateUIThread();
    this.runOnUiThread(updateUIThread);
    avec la classe UpdateUiThread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class UpdateUIThread implements Runnable {
    	String msg = ("CLIENT CONNECTE :" + ipAdresse);
    @Override
    public void run() {
            //ça coince ici...
    	textView1.setText(textView1.getText().toString()+ msg );
    	}
     
          }
    Désolé si je suis un boulet...mais j'ai du mal à comprendre

  8. #8
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Tu as des classes internes (des classes dans des classes), ce qui est une mauvaise habitude quand on débute. Dans ton cas, ca donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //une fois que j'ai la bonne ip connectée je change l'affichage de mon UI
    UpdateUIThread updateUIThread = new UpdateUIThread();
    ClientConnecte.this.runOnUiThread(updateUIThread);
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

Discussions similaires

  1. Problème affichage JProgressBar/Thread/.bat
    Par davly dans le forum Général Java
    Réponses: 3
    Dernier message: 13/03/2012, 09h59
  2. Problème d'affichage dans un thread
    Par mouette999 dans le forum C#
    Réponses: 8
    Dernier message: 29/11/2011, 17h15
  3. Affichage d'un JOptionPane au cours de l'exécution d'un Thread
    Par azad_892000 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 20/03/2007, 22h23
  4. problème d'affichage dans un thread
    Par innosang dans le forum POSIX
    Réponses: 8
    Dernier message: 20/12/2006, 20h40
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

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