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 dans le setTExt()


Sujet :

Android

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut Problème dans le setTExt()
    Bonjour à tous !
    Comme mis dans le titre mon setText() ne marche pas, enfin à moitié..
    Celui dans le onCreate() fonctionne très bien, mais celui dans le onTouch() ne s'effectue pas.
    Est ce que quelqu'un aurait une solution

    Code Java

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     package a.sd;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.telephony.SmsManager;
    import android.view.*;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.io.*;
    import java.net.Socket;
     
    public class MainActivity extends Activity implements View.OnTouchListener
    {
        private Socket socket;
        private BufferedReader inFromServer;
        private TextView etat;
     
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.main);
             Button b =(Button) findViewById(R.id.bouton);
             b.setOnTouchListener(this);
             etat=(TextView) findViewById(R.id.etat);
             etat.setText("Etat : déconnecté");
        }
        public boolean onTouch(View view, MotionEvent event){
            String numéro,message;
            String[] donnée;
            Toast toast;
            int i=0;
            try{
                    EditText text=(EditText) findViewById(R.id.adIp);
     
                    socket=new Socket(text.getText().toString(),17000);
                    etat.setText("Etat : connecté");
                    setVisible(true);
                    toast=Toast.makeText(getApplicationContext(),"Socket créé", Toast.LENGTH_LONG);
                    toast.show();
     
    		inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));                         
                    while(socket!=null){
                        message=inFromServer.readLine();
                        donnée=message.split("#");
                        numéro=donnée[0];
                        message=donnée[1];
     
                        SmsManager sms;
                        sms=SmsManager.getDefault();
                        sms.sendTextMessage(numéro, null, message, null, null);
                        toast=Toast.makeText(getApplicationContext(),"Message envoyé à "+numéro +message, Toast.LENGTH_LONG);
                        toast.show();
                    }     
     
     
            }
            catch(Exception e){
                System.out.println(e.getMessage());
            }
            return true;
        }
        public void onDestroy(){
            try{
                socket.close();
                inFromServer.close();
            }
            catch(Exception e){
     
            }
        }
    }
    LAYOUT :

    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
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/ip"
            >
        </TextView>
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/adIp"
            android:inputType="text">
        </EditText>
        <Button
            android:id="@+id/bouton"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:layout_gravity="center"
            android:text="@string/envoyer" />
        <TextView
            android:id="@+id/etat"
            android:editable="true"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/etat">
        </TextView>
    </LinearLayout>
    Merci !

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    je pense que tu dois avoir un paquet de "System.out.println" surtout....

    Remplace la ligne par:
    Log.e("onTouch","Erreur pendant la communication",e);
    Et tu aura tout dans le logcat.


    Serieusement, sinon, ... la gestion du "touch" à l'écran qui ouvre un socket ?
    Genre le truc qui est appelé peut-être 20 fois par seconde.... non c'est pas raisonnable !

    onClick peut-être ? Mais là encore... onClick peut passer le texte à "connecting..." mais en aucun cas ne pas revenir le temps que la communication n'ait été établie, que le Sms n'ait été envoyé... etc...
    Non franchement, il faut revoir l'architecture du programme. L'interface est là pour répondre à des événements, pas effectuer des opérations.

    Par contre c'est un devoir ? Ce n'est pas la première fois que je vois un appel à un serveur (socket ? pourquoi pas simplement http ?) suivi d'un envoi de SMS.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut
    Enfaites on doit juste cliquer une fois sur le bouton pour donner l'adresse ip du serveur et faire la connexion et après cela on ne doit plus toucher à l'application.

    Si je ne met pas tout dans le onTouch(), où dois-je mettre cette partie là? Dans le onStart()? Le problème c'est que je ne sais pas comment je peux dire au onStart() qu'il doit attendre le début de la connexion avant de lancer la boucle. J'avais pensé à un wait notify mais ça ne marchait pas.

    Merci de la réponse

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Déjà dans le "onClick" du button me parait plus adapté.

    Ensuite à part dans de super rares cas, on ne doit à priori jamais appeler "wait" / "notify" ou leur pendant "thread": Thread.sleep / Thread.join.
    Si on fait un thread, c'est pas pour attendre qu'il ait fini dans le thread initial.

    Il y a plein de solutions (handler, ...). La plus simple qui s'occupe de tout est "AsyncTask".

    On crée un tâche qui doit faire le travail....
    On implémente doInBackground qui sera réalisé dans un thread à part.
    (optionnel) On implémente onPreExecute et onPostExecute qui seront executés dans le thread UI (possibilité de modification de l'interface à ce moment).
    (optionnel) On implémente onProgressUpdate (executé dans le thread UI pour mettre à jour l'interface *pendant* le doInBackground, à condition que celui-ci appelle publishProgress()).

    Donc:
    - onClick: on crée la tâche, et on appelle .execute() dessus.
    - Task.onPreExecute: on desactive le bouton (parcequ'on veut pas que l'utilisateur s'amuse à cliquer plein de fois dessus).
    - Task.onPostExecute: on reactive le bouton (on a fini)
    - Task.doInBackground: on fait les connections au serveur, on envoie le Sms etc....

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 41
    Par défaut
    Merci beaucoup pour les infos, je ne connaissais pas cette classe !

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

Discussions similaires

  1. Problème dans la déclaration de Winmain
    Par lvdnono dans le forum DirectX
    Réponses: 3
    Dernier message: 29/05/2004, 13h38
  2. problème dans l'hebergement
    Par Redouane dans le forum ASP
    Réponses: 9
    Dernier message: 31/12/2003, 23h34
  3. Quel est le problème dans ce code ?
    Par Luther13 dans le forum C
    Réponses: 12
    Dernier message: 26/08/2003, 16h09
  4. Problème dans analisys Manager
    Par ien_ien23 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 11/07/2003, 14h38
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

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