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 :

Erreur "android.os.NetworkOnMainThreadException"


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 14
    Points : 5
    Points
    5
    Par défaut Erreur "android.os.NetworkOnMainThreadException"
    Bonjour,

    Débutant en Java, je réalise une application Android qui relève de l'intranet de mon école.

    Seulement voilà, je n'arrive pas à récupérer la réponse du serveur, mon getResponseCode() crash dans tous les sens, incapable de l'afficher/récupérer.

    Mon code, MainActivity.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
    package com.example.epiandroid;
     
    import java.io.IOException;
     
    import com.controlleur.ManageInput;
     
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
     
    public class MainActivity extends ActionBarActivity {
        Button myButton;
        int    isCorrect;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            System.out.println("MDR");
            myButton = (Button) this.findViewById(R.id.button1);
            myButton.setOnClickListener(new OnClickListener() {
     
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    ManageInput manager = new ManageInput();
     
                    String login = ((EditText)findViewById(R.id.loginInput)).getText().toString();
                    String password = ((EditText)findViewById(R.id.passwordInput)).getText().toString();
     
                    try {
                        if ((isCorrect = manager.checkInput(login, password)) == 200)
                            myButton.setText("good");
                        else
                            myButton.setText("fail");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
     
                }
            });
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
     
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    ManageInput.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
    package com.controlleur;
     
    import java.io.IOException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
     
    import org.codehaus.jackson.JsonParseException;
    import org.codehaus.jackson.map.DeserializationConfig;
    import org.codehaus.jackson.map.JsonMappingException;
    import org.codehaus.jackson.map.ObjectMapper;
     
    import android.os.AsyncTask;
     
    import com.modele.User;
     
    public class ManageInput {
        public String Login;
        public String Password;
        User user = new User();
     
        public int checkInput(String login, String password) throws IOException {
            URL myUrl = new URL("http://epitech-api.herokuapp.com/login?login="
                                        + login + "&password=" + password);
            HttpURLConnection conn = (HttpURLConnection) myUrl.openConnection();
     
            user.setLogin(login);
            user.setPassword(password);
     
            int responseCode = conn.getResponseCode();
                    ---> Segfault : System.out.println(responseCode);
            return 0;
        }
     
        /*public void retrieveToken() throws JsonParseException, JsonMappingException, IOException
        {
            ObjectMapper mapper = new ObjectMapper();
            User user = new User();
            URL myUrl = new URL("http://epitech-api.herokuapp.com/login?login=" 
                    + user.getLogin() + "&password=" + user.getPassword());
     
            mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            user = mapper.readValue(myUrl, User.class);
        }*/
    }
    Beaucoup de commentaires pour beaucoup de tests. Mais introuvable.

    Voici maintenant les erreurs :
    01-26 14:31:11.900: E/AndroidRuntime(15337): FATAL EXCEPTION: main
    01-26 14:31:11.900: E/AndroidRuntime(15337): android.os.NetworkOnMainThreadException
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at java.net.InetAddress.getAllByName(InetAddress.java:220)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at com.controlleur.ManageInput.checkInput(ManageInput.java:30)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at com.example.epiandroid.MainActivity$1.onClick(MainActivity.java:36)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.view.View.performClick(View.java:3644)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.view.View$PerformClick.run(View.java:14313)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.os.Handler.handleCallback(Handler.java:605)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.os.Handler.dispatchMessage(Handler.java:92)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.os.Looper.loop(Looper.java:137)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at android.app.ActivityThread.main(ActivityThread.java:4517)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at java.lang.reflect.Method.invokeNative(Native Method)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at java.lang.reflect.Method.invoke(Method.java:511)
    01-26 14:31:11.900: E/AndroidRuntime(15337): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
    Quelqu'un saurait-il m'indiquer comment corriger ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    NetworkOnMainThreadException : tu ne dois pas faire d'accès réseau ni de traitement "lourd" dans le thread dédié à l'affichage.
    Il faut passer par un thread distinct, par exemple en utilisant AsynTask...

    C'est une protection afin d'éviter de bloquer complètement l'affichage.


    a++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci de ta réponse rapide !

    Aurais-tu sous la main un exemple plutôt simple de cet outil?

  4. #4
    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
    La documentation : https://developer.android.com/refere...AsyncTask.html

    Tu as un exemple simple en début, ainsi que toute l'explication ensuite.
    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

  5. #5
    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
    Ou un tuto (pas encore très officiel, mais bon...) : http://olegoaer.developpez.com/tutos...e/android/rpc/
    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

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 14
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous.

    Je vous remercie de votre aide, j'ai résolu mon premier soucis !

    J'ai maintenant un noClassDefFoundError sur ObjectMapper alors que mes .jar sont correctement inclus. De plus, j'ai le même programme sans la gui pour Android ou je test tout dans la console et aucun problème..

    Des idées? :/

    Merci encore.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2010, 15h33
  2. [MySQL] Supprimer les erreurs de syntaxe dues aux quotes
    Par gotenks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2006, 16h10

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