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 :

Android : envoi de requete get avec l'emulateur


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Android : envoi de requete get avec l'emulateur
    Bonjour à tous,

    je cherche à faire un simple envoi en get sur une url distante.
    J'utilise l'emulateur sur un pc windows avec le bundle fourni par google : adt-bundle-windows-x86

    Pour faire au plus simple, je suis parti d'un nouveau projet qui fonctionne, le projet à la base est bien formé et l'emulateur repond bien, j'ai bien le "Hello World" qui s'affiche.

    A partir de là j'ai modifié le code pour jouer une simple requete GET.
    Vous pourrez voir mon code ci-dessous (j'ai laissé les imports, mais sur ce point ça doit être bon, je fais confiance à eclipse : ctrl+shift+o) :
    Vous constaterez que j'ai mis une url locale pour tester, mais j'ai également testé sur une url web qui m'appartient et ça ne fonctionne pas non plus.


    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
     
     
    package com.test.testpost;
     
    import java.io.IOException;
     
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
     
     
    public class MainActivity extends Activity 
    {
     
      @Override
      protected void onCreate(Bundle savedInstanceState) 
      {
        super.onCreate(savedInstanceState);
     
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet("http://10.0.2.2/android/index.php");
     
        try 
        {
            Log.i("test get", "test get avant requete");
    	client.execute(request);
    	Log.i("test get", "test get apres requete");
     
         } 
         catch (IOException e) 
         {
    	Log.i("test get", "test get exception levee 2");
    	e.printStackTrace();
          }
     
      } // fin de la methode
     
    } // fin de la classe
    J'ai ajouté la permission dans le manifeste tel que (cf en bleu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.test.testpost"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    
    
    <!-- suite du code cree par eclipse pour un nouveau projet -->
    mon script sur lequel je tape est en php, il devrait me créer un fichier (j'ai testé l'url en direct via un navigateur, le fichier est créé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $data = "post : ". print_r($_POST, true)." get : ".print_r($_GET, true);
    file_put_contents("dataGeoCool.txt", $data);
    echo "toto";
    Lorsque j'execute ce code, l'application Android crache : "L'application testPost s'est arretee".
    La derniere chaine logguée par mes soins est : "test get avant requete", ce qui sous entend que l'appelle de la commande "execute" cause le soucis.

    Voici une partie de ce que j'ai dans le LogCat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    03-16 14:28:20.559: I/test get(17025): test get avant requete
    03-16 14:28:20.812: D/AndroidRuntime(17025): Shutting down VM
    03-16 14:28:20.892: W/dalvikvm(17025): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
    03-16 14:28:20.972: E/AndroidRuntime(17025): FATAL EXCEPTION: main
    03-16 14:28:20.972: E/AndroidRuntime(17025): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.testpost/com.test.testpost.MainActivity}: android.os.NetworkOnMainThreadException
    03-16 14:28:20.972: E/AndroidRuntime(17025): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
    Certains post sur internet suggère de faire une tache en asynchrone pour lancer un nouveau process. Toutefois, je ne suis pas convaincu de cette action car pour l'instant, je ne vois pas pourquoi ma requete n'atteindrait pas mon script PHP (à la reception, un fichier devrait etre créé coté serveur) => je ne cherche pas a recuperer une information suite au lancement de ma requete GET sur mon terminal.
    Donc meme si ma partie client android attendait une reponse jusqu'à planter, je devrais avoir mon fichier créé sur le serveur.

    Auriez-vous une idée sur la raison pour laquelle je n'arrive pas à atteindre mon script php en mode GET ?

    Merci d'avance pour votre retour.

  2. #2
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Certains post sur internet suggère de faire une tache en asynchrone pour lancer un nouveau process. Toutefois, je ne suis pas convaincu de cette action car pour l'instant, je ne vois pas pourquoi ma requete n'atteindrait pas mon script PHP (à la reception, un fichier devrait etre créé coté serveur)
    Et pourtant, la recherche ici du mot clef de l'exception (android.os.NetworkOnMainThreadException) aurait donné la réponse instantanément: interdit de faire une opération "lente" dans le thread de l'UI...

    Ce la n'a rien à voir avec le fait que le script soit touché ou non, que la requête fonctionne ou non, cela a juste à voir avec la bonne programmation.

    Le "client.execute(request);" ne va pas "juste" envoyer 1 petit paquet et continue sans rien attendre en retour... il va faire les choses suivantes:
    * Démarrer le WiFi / la 3G si pas déjà fait (si le terminal est en veille par exemple, ces éléments peuvent-être temporairement 'désactivés' pour épargner de la batterie). Cela peut prendre 1 à 2s.
    * Ouvrir une connexion TCP avec le serveur. Dans un bon cas, c'est 2x le ping... disons 0,5s en 3G.
    * Envoyer la requête (encore un ping, 0,25s)
    * Attendre la réponse (même si pas utilisée, execute() retourne la réponse, donc il faut l'attendre et la lire). Si la création du fichier coté serveur est longue (0,5s disons), cela fait 0,75s.

    Donc, dans le meilleur cas on se retrouve a avoir un appel de fonction qui dure 3s à 4s dans le 'onCreate' de l'activité.

    Résultat: L'utilisateur a appuyé sur un bouton sensé ouvrir un fenêtre, l'application est bloquée pendant 4s. Si le téléphone est récent, une fenêtre "ANR (Application Not Responding)" s'affichera, si le téléphone est ancien il peut être plus "loose" (et autoriser 5/6s avant l'ANR). Dans tous les cas, TRES mauvaise appréciation de l'utilisateur.

    Et je ne parle que du "bon" cas... dans le cas ou on a un timeout, on verra une appli figée pendant 30s ou plus !

    Du coup, pour empêcher les programmeurs à faire ces erreurs de débutant, le système empêche toute transaction réseau dans le thread principal de l'application.

    => Utilisation d'une AsyncTask (ou d'un thread, mais c'est pareil).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    merci pour ton retour.

    Cela fonctionne désormais avec le mode asynchrone.

    Ta réponse m'a bien aidée.

    Bonne soirée.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/12/2011, 11h18
  2. Error loading preferences avec l'emulateur d'android
    Par doderic dans le forum Android
    Réponses: 0
    Dernier message: 11/04/2011, 18h04
  3. Récupérer un fichier par requete http avec parametre GET
    Par ggalou08 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/07/2008, 16h49
  4. pb get avec requete sql update
    Par babafredo dans le forum ASP
    Réponses: 1
    Dernier message: 09/10/2007, 09h35
  5. problème d'envoi d'une variable avec get
    Par ANISSS dans le forum Langage
    Réponses: 7
    Dernier message: 23/02/2007, 12h49

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