+ Répondre à la discussion Actualité déjà publiée
  1. #1
    Responsable Android

    Avatar de Feanorin
    Profil pro
    Inscrit en
    avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 4 589
    Points : 8 874
    Points
    8 874

    Par défaut L'accès HTTP sous Android

    Bonjour,

    Je vous présente ce tutoriel intitulé :

    L'accès HTTP sous Android



    Cet article décrit comment accéder à des ressources Web via HTTP dans Android. Il est basé sur Eclipse 3.7, Java 1.6 et Android 4.0 (Ice Cream Sandwich).

    Nous remercions Lars Vogel qui nous a aimablement autorisés à traduire et héberger cet article.
    N'hésitez pas à commentez cet article !
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2014
    Messages : 40
    Points : 27
    Points
    27

    Par défaut

    Bonjour,

    Je viens de tester ce tutoriel très bien fait mais bien sûr ... je rencontre un soucis. Je précise tout de suite que je suis un débutant bien parasité par la maitrise d'autres langages, ceci pouvant donc expliquer cela. Je poste ici parce que je me dis qu'il y a peu être une information à rajouter pour les gens comme moi.

    Le soucis rencontré : le flux récupéré est toujours vide. (une exception nulle est générée au passage de con.getInputStream() => e.getMessage() est nul mais catché).

    La fonction isNetworkAvailable() me renvoit bien True donc j'ai du réseau.
    J'ai ajouté un affichage de HttpURLConnection.HTTP_ACCEPTED qui me renvoit bien 202.
    (j'ai bien ajouté les permissions INTERNET et ACCESS_NETWORK_STATE, il faut savoir que j'en suis au moins au 4eme tutoriel pour faire ça).
    Je n'ai pas de proxy.
    J'ai rien dans le Logcat ou la console de spécial.
    J'utilise eclypse IDE for Androids developers 23.0.2.1259578.

    A noter aussi que cela fonctionne pareil sur l'emulateur et sur mon nexus 5 (ça s'exécute mais me ramène rien).

    Mon souhait initial est d'interroger une page php et de récupérer son contenu exécuté pour (actuellement) l'afficher (principe du httprequest en javascript).

    Il doit donc y avoir quelque chose de plus à faire ou ne pas faire ? (par exemple : ne pas mettre ce code dans le MainActivity ?)

    S'il faut plus de précision, je peux ouvrir un autre sujet si vous me le conseillez (noob aussi sur ce forum).

  3. #3
    Responsable Android

    Avatar de Feanorin
    Profil pro
    Inscrit en
    avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 4 589
    Points : 8 874
    Points
    8 874

    Par défaut

    Salut,

    TU as le nom de l erreur remontée , pas le message mais le nom de l'exception ?
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2014
    Messages : 40
    Points : 27
    Points
    27

    Par défaut

    Non rien du tout mais peut être que je ne sais pas comment la voir.
    Comme j'ai dit, j'ai rien dans la console, si j'affiche getMessage ou getStackTrace ou autre (j'n ai essayé pas mal) mais j'ai rien à chaque fois.
    Apparemment, InputStreamReader a des IOException, j'ai voulu mettre ça à la place d'Exception et la j'ai eu pleins d'erreurs dans la console mais l'application ne marche plus alors j'ai remis Exception.
    Je pense que c'est InputStreamReader puisqu'à la ligne d'après j'ai mis une trace à l'affichage qui ne s'exécute pas contrairement au passage dans le catch de l'exception.
    Je viens de remettre IOException, voici ce que je vois à ce moment la mais je ne sais pas si c'est lié ou pas
    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
     
    07-22 10:31:08.804: W/dalvikvm(1103): threadid=1: thread exiting with uncaught exception (group=0xb2a86ba8)
    07-22 10:31:08.814: E/AndroidRuntime(1103): FATAL EXCEPTION: main
    07-22 10:31:08.814: E/AndroidRuntime(1103): Process: com.example.test1, PID: 1103
    07-22 10:31:08.814: E/AndroidRuntime(1103): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test1/com.example.test1.MainActivity}: android.os.NetworkOnMainThreadException
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.access$800(ActivityThread.java:135)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.Handler.dispatchMessage(Handler.java:102)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.Looper.loop(Looper.java:136)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.main(ActivityThread.java:5017)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.lang.reflect.Method.invoke(Method.java:515)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at dalvik.system.NativeStart.main(Native Method)
    07-22 10:31:08.814: E/AndroidRuntime(1103): Caused by: android.os.NetworkOnMainThreadException
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at java.net.InetAddress.getAllByName(InetAddress.java:214)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.example.test1.MainActivity.httpRequest(MainActivity.java:50)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at com.example.test1.MainActivity.onCreate(MainActivity.java:31)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.Activity.performCreate(Activity.java:5231)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    07-22 10:31:08.814: E/AndroidRuntime(1103): 	... 11 more

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 837
    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 837
    Points : 22 786
    Points
    22 786
    Billets dans le blog
    1

    Par défaut

    Salut,



    @greedo01 : Et quel est ton code ?





    Sinon pour avoir jeter un coup d'oeil au tuto... j'aurais beaucoup à redire sur la méthode readStream() :
    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
    private void readStream(InputStream in) {
    		BufferedReader reader = null;
    		try {
    			reader = new BufferedReader(new InputStreamReader(in));
    			String line = "";
    			while ((line = reader.readLine()) != null) {
    				System.out.println(line);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (reader != null) {
    				try {
    					reader.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    • A quoi sert l'initialisation String line = ""; ? Cette valeur n'est jamais utilisé ?
    • Le e.printStackTrace() pour gérer l'exception c'est crade. Cela veut dire qu'on n'a aucun moyen au niveau du programme de savoir si cela a réussi ou pas.
      Il serait préférable de laisser remonter l'exception.
    • Ce pattern du try/finally est super-lourd à écrire et à lire... et pas toujours efficace.
      Il vaut mieux lui préférer le pattern suivant plus simple et plus robuste :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      Closeable variable = new Closeable();
      try {
          // code
      } finally {
          variable.close();
      }


    Bref il serait déjà mieux d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private void readStream(InputStream in) throws IOException {
    		BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    		try {
    			String line;
    			while ((line = reader.readLine()) != null) {
    				System.out.println(line);
    			}
    		} finally {
    			reader.close();
    		}
    	}
    Même s'il y a toujours un "problème" en ce qui me concerne, c'est qu'on ne connait pas l'encodage des caractères.
    Plutôt que de passer l'InputStream je ferais une méthode prenant directement l'URL en paramètre, ce qui permet de traiter le content-type s'il est présent...


    a++

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2014
    Messages : 40
    Points : 27
    Points
    27

    Par défaut

    Voici donc mon code :
    MainActivity .java (j'ai tout mis même s'il y a des passages qui ne concerne pas mon problème
    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
    75
    76
     
    package com.example.test1;
     
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
     
    import android.support.v7.app.ActionBarActivity;
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.Bundle;
    import android.widget.TextView;
     
     
    public class MainActivity extends ActionBarActivity 
    {
        @Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            TextView t1 = (TextView) findViewById(R.id.textView1);
       	 	t1.setText("RRRRRR");
     
       	 	if(isNetworkAvailable())
       	 	{
       	 		t1.setText(httpRequest("http://www.hbcnancysluc.com/test.php"));
       	 	}
       	 	else
       	 	{
       	 		t1.setText("pas de réseau");
       	 	}
     
        }
     
        public String httpRequest (String adress)
        {
    	     String answer = "", temp = "";
    	     try
    	     {
    		     URL url = new URL(adress);
    		     HttpURLConnection con = (HttpURLConnection) url.openConnection();
    		     con.setRequestProperty("Content-Type","application/octet-stream"); 
    		     answer = answer + HttpURLConnection.HTTP_ACCEPTED+ "(1)*" ; // 202 = acceptée => ok
    		     // plante ci-dessous
    		     InputStream in = con.getInputStream();
    		     answer = answer + "(2)*"; // juste pour voir si ça passe
    		     BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    		     while ((temp = reader.readLine()) != null)
    		     {
    		    	 answer = answer + temp;
    		     }
    		     reader.close();
    	     }
    	     catch (Exception e){answer = answer + e.getMessage()+"*";}
    	     return answer;
        }
     
     
        public boolean isNetworkAvailable() {
            ConnectivityManager cm = (ConnectivityManager) 
              getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = cm.getActiveNetworkInfo();
            // si aucun réseau n'est disponible, networkInfo sera null
            // sinon, vérifier si nous sommes connectés
            if (networkInfo != null && networkInfo.isConnected()) {
                return true;
            }
            return false;
        }
     
    }
    activity_main.xml : la pareil j'ai tout mis mais bon pas utile les images ou autre
    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
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.test1.MainActivity" >
     
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/logo"
            android:src="@drawable/ic_test" />
     
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/imageView1"
            android:layout_toRightOf="@+id/imageView1"
            android:contentDescription="@string/logo"
            android:src="@drawable/abc_ic_commit_search_api_holo_light" />
     
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/imageView2"
            android:layout_below="@+id/imageView2"
            android:layout_marginLeft="17dp"
            android:text="@string/button_label" />
     
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/imageView1"
            android:layout_toRightOf="@+id/button1"
            android:text="@string/button_label" />
     
    </RelativeLayout>
    AndroidManisfest.xml : pour vérifier la aussi au cas où
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test1"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="21" />
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>
    Donc ça exécute bien mon code, cela affiche tout ce que cela doit afficher sauf qu'en retour t1.setText, j'ai :
    202(1)*null* qui signifie selon moi (donc à vérifier^^) que :
    HttpURLConnection.HTTP_ACCEPTED+ "(1)*" => 202(1)*, la ligne s'exécute et il y a du réseau
    e.getMessage()+"*" => null*, passe dans le catche mais sans message
    Ma ligne answer = answer + "(2)*"; ne s'exécutant pas donc bien passé dans le catch sur l'exécution de InputStream in = con.getInputStream();

    (merci pour vos réponses et vos efforts )

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 837
    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 837
    Points : 22 786
    Points
    22 786
    Billets dans le blog
    1

    Par défaut

    Ta gestion des exceptions est tout pourri.
    Si tu ne sais pas quoi faire de l'exception il est préférable de la laisser remonter, au moins tu auras un trace complète de l'erreur.
    Là tu te contentes du getMessage() qui est inutile dans la plupart des cas... du coup tu perds toutes l'info concernant l'erreur... et ton programme continue de tourner comme si de rien n'était...



    De même l'opérateur + sur une String dans une boucle est à proscrire !!! Cela engendre un grand nombre d'objet temporaire...
    Ce n'est pas fait pour cela !!!

    Donc déjà ta méthode devrait plutôt ressembler à cela :
    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
    	public String httpRequest(String address) throws IOException {
    		URLConnection con = new URL(address).openConnection();
    		InputStream input = con.getInputStream();
    		try {
    			// TODO : il serait préférable de récupérer le Charset
    			Reader reader = new InputStreamReader(input);
    			try {
    				StringBuilder sb = new StringBuilder();
    				char[] cbuf = new char[8192];
    				int len;
     
    				while ( (len=reader.read(cbuf)) > 0 ) {
    					sb.append(cbuf, 0, len);
    				}
    				return sb.toString();
    			} finally {
    				reader.close();
    			}
    		} finally {
    			input.close();
    		}
    	}
    Ou bien en utilisant le try-with-ressource de Java 7 :
    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
    	public String httpRequest(String address) throws IOException {
    		URLConnection con = new URL(address).openConnection();
    		try (InputStream input = con.getInputStream();
    				Reader reader = new InputStreamReader(input)) {
     
    			StringBuilder sb = new StringBuilder();
    			char[] cbuf = new char[8192];
    			int len;
     
    			while ((len = reader.read(cbuf)) > 0) {
    				sb.append(cbuf, 0, len);
    			}
    			return sb.toString();
    		}
    	}


    Enfin ton problème vient du fait que tu fait tout cela dans le thread graphique, ce qui est interdit (car cela figerait l'interface).
    Il faut faire cela dans un thread séparé, via une AsyncTask par exemple...


    a++
    Sinon ton problème vient sûrement du fait que tu exécutes cela dans le thread graphique, ce qui est interdit.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    juillet 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : juillet 2014
    Messages : 40
    Points : 27
    Points
    27

    Par défaut

    Merci pour vos réponses.

    J'ai donc réussi à faire fonctionner mon bouzin malheureusement en utilisant un autre jeu de commande :
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;

    car en mettant en asynchrone, cela ne fonctionnait toujours pas, à priori je dirais que cela vient du format des données transmises (mais sans garanties parce que je suis loin de tout maitriser.

    Je met mes codes épurées pour ceux que ça pourrait intéresser
    MainActivity :
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    package com.example.test1;
     
    import java.io.InputStreamReader;
    import java.io.Reader;
     
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.impl.client.DefaultHttpClient;
     
    import android.support.v7.app.ActionBarActivity;
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.widget.TextView;
     
     
    public class MainActivity extends ActionBarActivity 
    {
    	private TextView tv;
    	@Override
        protected void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           if(isNetworkAvailable())
           {
        	   tv = (TextView) findViewById(R.id.textView1);		
       			new GetData(tv).execute("");
           }
           else
           {
        	   tv.setText("Pas de réseau");
           }
        }
     
        public boolean isNetworkAvailable() {
            ConnectivityManager cm = (ConnectivityManager) 
              getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = cm.getActiveNetworkInfo();
            // si aucun réseau n'est disponible, networkInfo sera null
            // sinon, vérifier si nous sommes connectés
            if (networkInfo != null && networkInfo.isConnected()) {
                return true;
            }
            return false;
        }
     
        private class GetData extends AsyncTask<String, Void, String> {
    		private TextView display;
     
    		GetData(TextView view){
    		    this.display = view;
    		}
     
    		@Override
    		protected String doInBackground(String... message) {
    			HttpClient httpclient;
    		    HttpGet request;
    		    HttpResponse response = null;
    		    String result = " ";
     
    		    try {
    		        httpclient = new DefaultHttpClient();
    		        request = new HttpGet("http://www.hbcnancysluc.com/test.php");
    		        response = httpclient.execute(request);
    		    }
    		    catch (Exception e) {
    		        result = "erreur appel http";
    		    }
     
    		    try {
    			       Reader reader = (new InputStreamReader(response.getEntity().getContent()));
    		    		try {
    						StringBuilder sb = new StringBuilder();
    						char[] cbuf = new char[8192];
    						int len;
     
    						while ( (len=reader.read(cbuf)) > 0 ) {
    							sb.append(cbuf, 0, len);
    						}
    						result = sb.toString();
    					} finally {
    						reader.close();
    					}
     
     
     
    				    } catch (Exception e) {
    				        result = "erreur import des données";
    				    }
    		    return result;
    		}
     
    		protected void onPostExecute(String result) {
    		    this.display.setText(result);
    		}
    	}
    }
    activity_main.xml
    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
     
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.test1.MainActivity" >
     
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/button_label" />
     
    </RelativeLayout>
    Le manifest :
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.test1"
        android:versionCode="1"
        android:versionName="1.0" >
     
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="21" />
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
     
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     
    </manifest>
    Encore une fois merci à vous car je commençais à désespérer.

  9. #9
    Responsable Android

    Avatar de Feanorin
    Profil pro
    Inscrit en
    avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 4 589
    Points : 8 874
    Points
    8 874

    Par défaut

    07-22 10:31:08.814: E/AndroidRuntime(1103): Caused by: android.os.NetworkOnMainThreadException
    Ton problème venait du fait que tu lancait ta requete depuis le Main Thread. Dans le tutoriel tu pourra trouver la réponse ici :

    Si vous ciblez Android 3.0 ou supérieur, vous pouvez désactiver l'accès réseau effectué dans une tâche d'arrière-plan, via le code suivant, au début de la méthode onCreate() de votre activité.

    Sélectionnez
    StrictMode.ThreadPolicy policy = new StrictMode.
    ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    Cette désactivation est déconseillée, mais dans ce tutoriel nous utilisons cette option pour être en mesure d'expliquer l'accès réseau, indépendamment des processus d'arrière-plan.
    Je te déconseille d'utiliser cette combine et de mettre ta requete depuis un AsyncTask ou un Thread !

    Et c'est NetworkOnMainThreadException que je cherchais . Voici ton exception!
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

Discussions similaires

  1. Enregistrer une flux HTTP sur un serveur sous Android
    Par ensinienne dans le forum Android
    Réponses: 0
    Dernier message: 10/04/2012, 18h55
  2. Réponses: 1
    Dernier message: 13/10/2011, 15h32
  3. Probleme d'acces à http://localhost:8080/ sous IE
    Par elbopha dans le forum Tomcat
    Réponses: 2
    Dernier message: 21/12/2006, 23h33

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