Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Problème Mise en place Webservice

Sujet résolu
    3 août 2012 à 10:59:00

    Oui, effectivement. C'est bizarre. J'ai toujours eu des erreurs lorsque je n'ai pas exécuter mes requêtes dans un thread secondaire et c'est vivement conseillé de toute façon.
    • Partager sur Facebook
    • Partager sur Twitter
    Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
      3 août 2012 à 11:00:16

      Merci pour le restore ^^

      Bon donc je te poste mon code puis je dis ce qui est en rouge :p (tu vas me dire que j'ai rien compris ^^

      package rapport.presse.cim;
      
      import java.io.BufferedReader;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      
      import org.apache.http.HttpEntity;
      import org.apache.http.HttpResponse;
      import org.apache.http.NameValuePair;
      import org.apache.http.client.HttpClient;
      import org.apache.http.client.entity.UrlEncodedFormEntity;
      import org.apache.http.client.methods.HttpPost;
      import org.apache.http.impl.client.DefaultHttpClient;
      import org.apache.http.message.BasicNameValuePair;
      import org.json.JSONArray;
      import org.json.JSONException;
      import org.json.JSONObject;
      
      import android.os.AsyncTask;
      import android.util.Log;
      
      public class httpConnexion extends AsyncTask<Void, String, Void> {
      	
      	public static final String strURL = "http://192.168.1.100/ville.php?donnee=getL";
      	public ArrayList<String> getServerData(){
      		String result = "";
      		InputStream is = null;
      		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
      		nameValuePairs.add(new BasicNameValuePair("ville","L"));
      		ArrayList<String> data = new ArrayList<String>();
      		
      	@Override
      	protected void doInBackground(Void... arg0) {
      		// TODO Auto-generated method stub
      		
      	/**===============================================
      					Envoie de la requête HTTP
      	===============================================**/ 
      			try{
      				HttpClient httpclient = new DefaultHttpClient();
      				HttpPost httppost = new HttpPost(strURL);
      				httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
      				HttpResponse response = httpclient.execute(httppost);
      				HttpEntity entity = response.getEntity();
      				is = entity.getContent();
      			}
      			catch(Exception e){
      				Log.e("log_tag", "Error in http connection " + e.toString());
      			}
      	/**===============================================
      						End
      	===============================================**/ 
      			
      	/**===============================================
      			Conversion de la requête en string
      	===============================================**/ 
      			try{
      				BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
      				StringBuilder sb = new StringBuilder();
      				String line = null;
      				while ((line = reader.readLine()) != null) {
      					sb.append(line + "\n");
      				}
      				is.close();
      				result=sb.toString();
      			}catch(Exception e){
      				Log.e("log_tag", "Error converting result " + e.toString());
      			}
      			
      	/**===============================================
      						End
      	===============================================**/ 
      
      	/**===============================================
      			On parse les données Json
      	===============================================**/
      			try{
      				JSONArray jArray = new JSONArray(result);
      				
      				for(int i=0;i<jArray.length();i++){
      					JSONObject json_data = jArray.getJSONObject(i);
      					data.add(json_data.getString("Nom_ville"));
      					// Affichage ID_ville et Nom_ville dans le LogCat
      					Log.i("log_tag",json_data.getString("Nom_ville")
      					);
      					// Résultats de la requête
      				}
      			}catch(JSONException e){
      				Log.e("log_tag", "Error parsing data " + e.toString());
      			}
      			
      	/**===============================================
      						End
      	===============================================**/
      			return null;
      		}
      		
      		return data;
      	}	
      }
      


      Pour ma class httpConnexion il me dit ça: The type httpConnexion must implement the inherited abstract method AsyncTask<Void,String,Void>.doInBackground(Void...)
      Bon je suppose que c'est à cause des void dans les paramètres :p

      Pour la fonction doInBackground: void is an invalid type for the variable doInBackground
      Et puis les ... syntaxe error et l'arg0 il ne sait pas le résoudre ^^

      C'est les seules erreurs que je vois :p



      • Partager sur Facebook
      • Partager sur Twitter
        3 août 2012 à 12:01:36

        Ca m'ennuie de ne pas avoir réussi à terminer mon chapitre sur les requêtes HTTP. Tu ne t'y prends pas très bien. :/

        Déjà, tu n'as pas fermé ta méthode getServeurData. Les erreurs qui s'affichent sont faussées. Puis, je n'ai pas testé mais voilà comment je vois les choses (j'ai commenté mon code. Je n'ai pas le temps d'expliquer le tout en détail) :

        package be.impactit.shared.views;
        
        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.util.ArrayList;
        import java.util.List;
        import java.util.Map;
        
        import org.apache.http.HttpEntity;
        import org.apache.http.HttpResponse;
        import org.apache.http.NameValuePair;
        import org.apache.http.client.ClientProtocolException;
        import org.apache.http.client.HttpClient;
        import org.apache.http.client.entity.UrlEncodedFormEntity;
        import org.apache.http.client.methods.HttpPost;
        import org.apache.http.impl.client.DefaultHttpClient;
        import org.apache.http.message.BasicNameValuePair;
        import org.json.JSONArray;
        import org.json.JSONException;
        import org.json.JSONObject;
        
        import android.util.Log;
        import be.impactit.directory.activities.BuildConfig;
        
        public class HttpConnexion {
        	private static final String TAG = "log_tag";
        
        	/**
        	 * Télécharge via une requête POST. Cette méthode doit se faire dans un
        	 * thread secondaire !
        	 * 
        	 * @param url
        	 *            Url de la requête
        	 * @param params
        	 *            Paramètres à rajouter
        	 * @return input stream
        	 */
        	public InputStream downloadPost(String url, Map<String, String> params) {
        		InputStream is = null;
        		try {
        			HttpClient httpclient = new DefaultHttpClient();
        			HttpPost httpPost = new HttpPost(url);
        			// Ajoute des paramètres à la requête
        			if (params != null) {
        				List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        				for (Map.Entry<String, String> e : params.entrySet()) {
        					nameValuePairs.add(new BasicNameValuePair(e.getKey(), e
        							.getValue()));
        				}
        				httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        			}
        			HttpResponse response = httpclient.execute(httpPost);
        			HttpEntity entity = response.getEntity();
        			is = entity.getContent();
        		} catch (ClientProtocolException e) {
        			if (BuildConfig.DEBUG)
        				Log.e(TAG, "Client Protocol Exception : " + e.toString());
        		} catch (IOException e) {
        			if (BuildConfig.DEBUG)
        				Log.e(TAG, "IO Exception : " + e.toString());
        		}
        		return is;
        	}
        
        	/**
        	 * Convertis un objet InputStream en chaine de caractères
        	 * 
        	 * @param is
        	 *            Input Stream
        	 * @return fichier json en string
        	 */
        	public String convertInputStreamToString(InputStream is) {
        		StringBuilder sb = new StringBuilder();
        		try {
        			BufferedReader reader = new BufferedReader(new InputStreamReader(
        					is, "iso-8859-1"), 8);
        			String line = null;
        			while ((line = reader.readLine()) != null) {
        				sb.append(line + "\n");
        			}
        			is.close();
        		} catch (Exception e) {
        			Log.e(TAG, "Error converting result " + e.toString());
        		}
        		return sb.toString();
        	}
        
        	/**
        	 * Parse le fichier JSON dans une liste
        	 * 
        	 * @param result
        	 *            Fichier json
        	 * @return liste du résultat du parsing
        	 */
        	public List<String> parseJsonFile(String result) {
        		List<String> data = new ArrayList<String>();
        		try {
        			JSONArray jArray = new JSONArray(result);
        			for (int i = 0; i < jArray.length(); i++) {
        				JSONObject json_data = jArray.getJSONObject(i);
        				data.add(json_data.getString("Nom_ville"));
        				// Affichage ID_ville et Nom_ville dans le LogCat
        				Log.i("log_tag", json_data.getString("Nom_ville"));
        				// Résultats de la requête
        			}
        		} catch (JSONException e) {
        			Log.e(TAG, "Error parsing data " + e.toString());
        		}
        		return data;
        	}
        }
        


        package be.impactit.shared.views;
        
        import java.io.InputStream;
        import java.util.ArrayList;
        import java.util.List;
        
        import android.app.Activity;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.widget.ArrayAdapter;
        
        public class TestClass extends Activity {
        
        	private HttpConnexion mHttpConnexion = new HttpConnexion();
        	private InputStream mInputStream;
        	private List<String> mData = new ArrayList<String>();
        	private ArrayAdapter<String> mAdapter;
        
        	@Override
        	protected void onCreate(Bundle savedInstanceState) {
        		super.onCreate(savedInstanceState);
        		// setContent etc
        
        		new AsyncDownload().execute();
        		
        		// Création d'un adaptateur avec aucun élèment dans la liste
        		this.mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData);
        		// Attache à son adaptateur à sa ListView
        	}
        
        	public class AsyncDownload extends AsyncTask<Void, Void, Void> {
        
        		@Override
        		protected Void doInBackground(Void... params) {
        			// Je suis dans le thread secondaire
        			mInputStream = mHttpConnexion.downloadPost(
        					"http://192.168.1.100/ville.php?donnee=getL", null);
        			return null;
        		}
        		
        		@Override
        		protected void onPostExecute(Void result) {
        			super.onPostExecute(result);
        			// Ici je ne suis plus dans le thread secondaire
        			if (mInputStream != null) {
        				// Aucun problème survenu
        				String res = mHttpConnexion.convertInputStreamToString(mInputStream);
        				mData = mHttpConnexion.parseJsonFile(res);
        				// Ajoute tous les élèments dans l'adaptateur
        				for (String str : mData) {
        					mAdapter.add(str);
        				}
        				// Notifie les changements pour les voir à l'écran
        				mAdapter.notifyDataSetChanged();
        			}
        		}
        
        	}
        
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
        Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
          3 août 2012 à 12:25:00

          Sisi elle est fermée ^^
          J'avais juste mal indenté et ça prête à confusion :p
          Mais donc dans ton code tu n'utilises pas d’asynchrone?
          • Partager sur Facebook
          • Partager sur Twitter
            3 août 2012 à 12:27:23

            Si mais du côté de la classe qui utilise HttpConnexion (TestClass chez moi) mais first chez toi.
            • Partager sur Facebook
            • Partager sur Twitter
            Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
              3 août 2012 à 12:31:19

              Bon j'ai un peu modifié mon code pour que ça ressemble au tient, mais je ne test pas de suite pasque ça va planter :p
              J'ai juste besoin d'explications pour tes paramètres (pour dans mon cas).

              En fait ton code m'a quand même donné pas mal d'idées :p
              Donc si tu te souviens un peu de ma structure, j'ai genre 6 boutons et en-dessous de chaque j'ai une listView.
              Donc je vois que tu te bases sur params, mais c'est appelé une fois dans la fonction, mais si je clique sur un bouton, j'aimerais changer ces paramètres qui passe par le post pour récupérer les bonne infos.
              Mais là je ne vois pas trop via ton système comment je pourrais faire en fait :s

              Et j'ai une petite question, pour les cliques, je récupères mes 6 boutons et donc mes listView en plus je susspose, et par exemple je met un listener sur le bouton 1.
              Et là en fait je suppose que j'appel la fonction doInBackground(Void... params) pour pouvoir fournir les paramètre en fonction de la liste que j'affiche et ensuite la seconde fonction pour récupérer les valeurs?
              • Partager sur Facebook
              • Partager sur Twitter
                3 août 2012 à 19:48:17

                Il a bien fallu que je relise 2-3 fois ton poste pour que je puisse comprendre (du moins, je l'espère avoir compris ^^ ). Donc :

                Citation : vangoeth

                En fait ton code m'a quand même donné pas mal d'idées :p


                C'était l'idée. Je n'ai pas testé le code que je t'ai fourni (mais il devrait être bon).

                Citation : vangoeth

                Donc si tu te souviens un peu de ma structure, j'ai genre 6 boutons et en-dessous de chaque j'ai une listView.
                Donc je vois que tu te bases sur params, mais c'est appelé une fois dans la fonction, mais si je clique sur un bouton, j'aimerais changer ces paramètres qui passe par le post pour récupérer les bonne infos.
                Mais là je ne vois pas trop via ton système comment je pourrais faire en fait :s


                Si tu parles des paramètres que j'envoie à ma méthode public InputStream downloadPost(String url, Map<String, String> params), il s'agit simplement des valeurs que tu comptes passer à ton serveur pour qu'il traite ta requête. Il suffit de lui envoyer une Map avec comme clé, la clé que tu vas utiliser côté PHP pour récupérer la valeur du côté valeur de la Map. Je ne sais pas si je suis clair mais j'ai cru comprendre que tu voulais passer des paramètres au vue de ton code précédent.

                Citation : vangoeth

                Et j'ai une petite question, pour les cliques, je récupères mes 6 boutons et donc mes listView en plus je susspose, et par exemple je met un listener sur le bouton 1.
                Et là en fait je suppose que j'appel la fonction doInBackground(Void... params) pour pouvoir fournir les paramètre en fonction de la liste que j'affiche et ensuite la seconde fonction pour récupérer les valeurs?


                Là je suis encore moins sûr d'avoir compris ^^ mais oui, il est tout à fait possible de passer des objets à la méthode doInBackground(Void... params). Il faut alors changer l'un des opérateurs génériques de la classe interne AsyncTask. Lorsque tu appelleras la méthode execute() sur l'instance de ton AsyncTask, tu lui donnes en paramètre ce que tu veux. Tout ça devrait être expliqué dans le tutoriel que je t'ai donné plus haut.

                Si j'ai pas tout bien compris, re-explique clairement. ^^
                • Partager sur Facebook
                • Partager sur Twitter
                Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                  3 août 2012 à 20:01:49

                  Alors pour la première question c'est parfait si j'ai bien compris ta réponse :p
                  Donc ça permet de récupérer les valeurs dans la requête sql via $_REQUEST['nom du post']?

                  Pour la seconde, je récupère les boutons et les listView de mon layout, puis dans chaque fonction de click j'appel doInBackground() et onPostExecute puis je fait le test pour afficher ou non la liste? par contre j'ai un blocage surt ton for(str : mdata) parce que pour moi un for c'est for i:1:10 ou for 1:10 donc par défaut me semble que c'est par pat de 1? ^^

                  Pas facile à expliquer tt ça :p
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 août 2012 à 21:50:53

                    Bon, je vais essayé de structurer toutes tes questions. :)

                    Citation : vangoeth

                    Alors pour la première question c'est parfait si j'ai bien compris ta réponse :p
                    Donc ça permet de récupérer les valeurs dans la requête sql via $_REQUEST['nom du post']?


                    Ouaip.

                    Citation : vangoeth

                    Pour la seconde, je récupère les boutons et les listView de mon layout, puis dans chaque fonction de click j'appel doInBackground() et onPostExecute puis je fait le test pour afficher ou non la liste?


                    Non, tu ne dois pas appeler toi même doInBackground() et onPostExecute. Sur ton instance de la méthode AsyncTask, tu appelles la méthode execute() et le système se chargera d'appeler les méthodes callback que tu implémentes dedans. Tu ne dois pas te soucier de les appeler pour résumer. :)

                    Citation : vangoeth

                    par contre j'ai un blocage surt ton for(str : mdata) parce que pour moi un for c'est for i:1:10 ou for 1:10 donc par défaut me semble que c'est par pat de 1? ^^


                    Il s'agit d'un autre type de boucle.
                    for (String str : mData) {
                    	mAdapter.add(str);
                    }
                    


                    =

                    for (int i = 0; i < mData.size(); i++) {
                    	String str = mData.get(i);
                    	mAdapter.add(str);
                    }
                    


                    Citation : vangoeth

                    Pas facile à expliquer tt ça :p


                    Normal. ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                      4 août 2012 à 10:44:30

                      Bon maintenant c'est assé amusant ^^
                      Mon appli se lance avec tous les boutons (normal vu que je les appel ^^) mais quand je clique sur le seul bouton que j'ai rendu cliquable, l'app plante xD

                      Je te passe mon code que j'ai un peu modifié (le paramètre on verra ça après, une chose à la fois :p)
                      Et le logCat bien sûr ^^

                      Mon httpConnexion:
                      package rapport.presse.cim;
                      
                      import java.io.BufferedReader;
                      import java.io.InputStream;
                      import java.io.InputStreamReader;
                      import java.util.ArrayList;
                      import java.util.List;
                      
                      import org.apache.http.HttpEntity;
                      import org.apache.http.HttpResponse;
                      import org.apache.http.NameValuePair;
                      import org.apache.http.client.HttpClient;
                      import org.apache.http.client.entity.UrlEncodedFormEntity;
                      import org.apache.http.client.methods.HttpPost;
                      import org.apache.http.impl.client.DefaultHttpClient;
                      import org.apache.http.message.BasicNameValuePair;
                      import org.json.JSONArray;
                      import org.json.JSONException;
                      import org.json.JSONObject;
                      
                      import android.os.AsyncTask;
                      import android.util.Log;
                      
                      public class httpConnexion {
                      	
                      	//public static final String strURL = "http://192.168.1.100/ville.php?donnee=getL";
                      	
                      	
                      	/**===============================================
                      	Envoie de la requête HTTP
                      	===============================================**/ 
                      	
                      	/**
                      	 * @param url
                      	 * @param params
                      	 * @return input stream
                      	 **/
                      	public InputStream getConnexionHttp(String url){ //Ajout des paramètres par la suite pour post
                      		InputStream is = null;
                      			
                      		try{
                      			HttpClient httpclient = new DefaultHttpClient();
                      			HttpPost httppost = new HttpPost(url);
                      			List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                      			nameValuePairs.add(new BasicNameValuePair("ville","L"));
                      			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                      			HttpResponse response = httpclient.execute(httppost);
                      			HttpEntity entity = response.getEntity();
                      			is = entity.getContent();
                      		}
                      		catch(Exception e){
                      			Log.e("log_tag", "Error in http connection " + e.toString());
                      		}
                      		return is;
                      	}
                      	/**===============================================
                      					End
                      	===============================================**/ 
                      			
                      	/**===============================================
                      		Conversion de la requête en string
                      	===============================================**/ 
                      	public String convertToString(InputStream is){
                      		StringBuilder sb = new StringBuilder();
                      		try{
                      			BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                      			String line = null;
                      			while ((line = reader.readLine()) != null) {
                      				sb.append(line + "\n");
                      			}
                      			is.close();
                      		}catch(Exception e){
                      			Log.e("log_tag", "Error converting result " + e.toString());
                      		}
                      		return sb.toString();
                      	}			
                      	/**===============================================
                      					End
                      	===============================================**/ 
                      
                      	/**===============================================
                      		On parse les données Json
                      	===============================================**/
                      	public List<String> parseJsonFile(String result){
                      		List<String> data = new ArrayList<String>();
                      		try{
                      			JSONArray jArray = new JSONArray(result);
                      			for(int i=0;i<jArray.length();i++){
                      				JSONObject json_data = jArray.getJSONObject(i);
                      				data.add(json_data.getString("Nom_ville"));
                      				// Affichage ID_ville et Nom_ville dans le LogCat
                      				Log.i("log_tag",json_data.getString("Nom_ville")
                      				);
                      				// Résultats de la requête
                      			}
                      		}catch(JSONException e){
                      			Log.e("log_tag", "Error parsing data " + e.toString());
                      		}
                      		return data;
                      			
                      		/**===============================================
                      						End
                      		===============================================**/	
                      	}	
                      }
                      


                      Et mon first:

                      package rapport.presse.cim;
                      
                      import java.io.InputStream;
                      import java.util.ArrayList;
                      import java.util.List;
                      
                      import android.os.AsyncTask;
                      import android.os.Bundle;
                      import android.support.v4.app.Fragment;
                      import android.view.LayoutInflater;
                      import android.view.View;
                      import android.view.View.OnClickListener;
                      import android.view.ViewGroup;
                      import android.widget.ArrayAdapter;
                      import android.widget.Button;
                      import android.widget.ListView;
                      
                      
                      public class first extends Fragment {
                      	
                      	private httpConnexion mHttpConnexion = new httpConnexion();
                      	private InputStream mInputStream;
                      	private List<String> mData = new ArrayList<String>();
                      	private ArrayAdapter<String> mAdapter;
                      	private ListView mListViewAll;
                      	private ListView mListViewQuot;
                      	private ListView mListViewHebd;
                      	private ListView mListViewMens;
                      	private ListView mListVieuwTrim;
                      	private ListView mListViewAnn;
                      	Button mButton1;
                      	Button mButton2;
                      	Button mButton3;
                      	Button mButton4;
                      	Button mButton5;
                      	Button mButton6;
                      	
                      	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                              View v= inflater.inflate(R.layout.first, container, false);
                              
                              
                              ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);
                              
                              /**===============================================
                      				Gestion des cliques et listes
                      		===============================================**/ 
                      		//récupération des Boutons
                      		mButton1 = (Button) v.findViewById(R.id.all);
                      		mButton2= (Button) v.findViewById(R.id.quot);
                      		mButton3 = (Button)v.findViewById(R.id.hebd);
                      		mButton4 = (Button)v.findViewById(R.id.mens);
                      		mButton5 = (Button)v.findViewById(R.id.trim);
                      		mButton6 = (Button)v.findViewById(R.id.ann);
                      		mListViewAll = (ListView) v.findViewById(R.id.ListViewAll);
                      		mListViewAll.setAdapter(mAdapter);
                      		
                      		//Test action sur le bouton + visibilité du ListView
                      		mButton1.setOnClickListener (new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				new AsyncDownload().execute();
                      				mListViewAll.setVisibility(View.GONE);
                      				if(mListViewAll.isShown()){
                      					mListViewAll.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListViewAll.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                              return v;
                      	}
                      	
                      	public class AsyncDownload extends AsyncTask<Void, Void, Void>{
                      
                      		@Override
                      		protected Void doInBackground(Void... params) {
                      			// TODO Auto-generated method stub
                      			mInputStream = mHttpConnexion.getConnexionHttp("http://192.168.1.100/ville.php?donnee=getL");
                      			return null;
                      		}
                      		
                      		@Override
                      		protected void onPostExecute(Void result) {
                      			super.onPostExecute(result);
                      			if (mInputStream != null){
                      				String res = mHttpConnexion.convertToString(mInputStream);
                      				mData = mHttpConnexion.parseJsonFile(res);
                      				for (String str : mData){
                      					mAdapter.add(str);
                      				}
                      				mAdapter.notifyDataSetChanged();
                      			}
                      		}
                      		
                      	}
                      }
                      /**===============================================
                      		Gestion des listView
                      ===============================================**/  
                            /** 1.Récupération du ListView
                             *  2. Cacher la ListView
                             *  3.Création de l'adapter
                             *  4.On passe nos données au composant ListView
                              
                             
                                  
                      		
                      		
                      		
                      		/**this.mListViewQuot = (ListView) v.findViewById(R.id.ListViewQuot);
                              mListViewQuot.setVisibility(View.GONE);
                      		ArrayAdapter<String> mTabQuot = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
                      		this.mListViewQuot.setAdapter(mTabQuot);
                      		
                      		this.mListViewHebd = (ListView) v.findViewById(R.id.ListViewHebd);
                              mListViewHebd.setVisibility(View.GONE);
                      		ArrayAdapter<String> mTabHebd = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
                      		this.mListViewHebd.setAdapter(mTabHebd);
                      		
                      		this.mListViewMens = (ListView) v.findViewById(R.id.ListViewMens);
                      		mListViewMens.setVisibility(View.GONE);
                      		ArrayAdapter<String> mTabMens = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
                      		this.mListViewMens.setAdapter(mTabMens);
                      		
                      		this.mListVieuwTrim = (ListView) v.findViewById(R.id.ListViewTrim);
                      		mListVieuwTrim.setVisibility(View.GONE);
                      		ArrayAdapter<String> mTabTrim = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
                      		this.mListVieuwTrim.setAdapter(mTabTrim);
                      		
                      		this.mListViewAnn = (ListView) v.findViewById(R.id.ListViewAnn);
                      		mListViewAnn.setVisibility(View.GONE);
                      		ArrayAdapter<String> mTabAnn = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
                      		this.mListViewAnn.setAdapter(mTabAnn);**/
                      		
                      		
                      /**End
                      
                      
                      		
                      		
                      		
                      		mButton2.setOnClickListener(new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				if(mListViewQuot.isShown()){
                      					mListViewQuot.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListViewQuot.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                      		
                      		mButton3.setOnClickListener(new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				if(mListViewHebd.isShown()){
                      					mListViewHebd.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListViewHebd.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                      		
                      		mButton4.setOnClickListener(new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				if(mListViewMens.isShown()){
                      					mListViewMens.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListViewMens.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                      		
                      		mButton5.setOnClickListener(new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				if(mListVieuwTrim.isShown()){
                      					mListVieuwTrim.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListVieuwTrim.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                      		
                      		mButton6.setOnClickListener(new View.OnClickListener() {
                      			
                      			public void onClick(View v) {
                      				// TODO Auto-generated method stub
                      				if(mListViewAnn.isShown()){
                      					mListViewAnn.setVisibility(View.GONE);
                      				}
                      				else{
                      					mListViewAnn.setVisibility(View.VISIBLE);
                      				}
                      			}
                      		});
                      		
                      /**End
                              return v;
                              
                      	}**/
                      


                      Et pour finir le logCat qui s'existe au moment du clique ^^ :
                      08-04 08:41:36.121: E/AndroidRuntime(663): FATAL EXCEPTION: main
                      08-04 08:41:36.121: E/AndroidRuntime(663): java.lang.NullPointerException
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at rapport.presse.cim.first$AsyncDownload.onPostExecute(first.java:91)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at rapport.presse.cim.first$AsyncDownload.onPostExecute(first.java:1)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.os.AsyncTask.finish(AsyncTask.java:602)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.os.AsyncTask.access$600(AsyncTask.java:156)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.os.Handler.dispatchMessage(Handler.java:99)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.os.Looper.loop(Looper.java:137)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at android.app.ActivityThread.main(ActivityThread.java:4424)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at java.lang.reflect.Method.invokeNative(Native Method)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at java.lang.reflect.Method.invoke(Method.java:511)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
                      08-04 08:41:36.121: E/AndroidRuntime(663):         at dalvik.system.NativeStart.main(Native Method)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 août 2012 à 11:06:45

                        C'est simple, tu initialises pas le bon adaptateur à la ligne 42. Tu dois initialiser celui en attribut de ta classe. :)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                          4 août 2012 à 11:11:22

                          Atta parce que là je en te suis pas :p
                          J'ai un mAdapter initialisé à la ligne 24 et c'est le même :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 août 2012 à 11:13:08

                            Non, il est déclaré à la ligne 24. Il n'est pas encore initialiser. A la ligne 42, enlève la déclaration. Change donc :

                            ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);

                            En :

                            mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                              4 août 2012 à 11:14:43

                              Ha ok le fait des mettre ArrayAdapter<String> devant c'est pas bon? ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 août 2012 à 11:19:05

                                Non, parce que tu crées une nouvelle variable dans ce cas là sans initialiser ton attribut. (notion fondamentale de la programmation orienté objet :-° )
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                  4 août 2012 à 11:21:54

                                  Je t'avoue que là l'orienté object j'en m'en prend plein la g***** mais ça va t'expliques pas mal donc ça rentre petit à petit xD

                                  Par contre là j'ai un bug assé amusant :p
                                  Je clique une fois sur le bouton ça m'afficher les 2 villes (victoire) j'appuie une 2ème fois sur le bouton pour replier la liste, ça me rajoute les 2 villes à la liste xD donc j'ai "Lille, Lion, Lille, Lion) xD
                                  J'ai bougé l'appel de la fonction pour que ça se passe que qd la view est gone et qu'il faut la déplier mais pareil (c'est assé perturbant ^^)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 août 2012 à 11:34:08

                                    Ah, tu n'as pas de notion d'orienté objet. Va falloir t'y mettre quand tu as le temps parce que c'est un peu la base à avoir. Je te conseille le tuto Java du site pour comprendre un peu comment ça fonctionne sinon tu risques d'être bloqué à un moment ou un autre. :)

                                    Pour ton problème, c'est normal. Tu demandes d'exécuter le thread secondaire à chaque clique. Il suffit de la lancer une fois et c'est tout. Fais quelque chose comme ça :

                                    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                                            View v= inflater.inflate(R.layout.first, container, false);
                                            
                                            
                                            mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);
                                            
                                            /**===============================================
                                    				Gestion des cliques et listes
                                    	===============================================**/ 
                                    	//récupération des Boutons
                                    	mButton1 = (Button) v.findViewById(R.id.all);
                                    	mButton2= (Button) v.findViewById(R.id.quot);
                                    	mButton3 = (Button)v.findViewById(R.id.hebd);
                                    	mButton4 = (Button)v.findViewById(R.id.mens);
                                    	mButton5 = (Button)v.findViewById(R.id.trim);
                                    	mButton6 = (Button)v.findViewById(R.id.ann);
                                    	mListViewAll = (ListView) v.findViewById(R.id.ListViewAll);
                                    	mListViewAll.setAdapter(mAdapter);
                                    		
                                    	//Test action sur le bouton + visibilité du ListView
                                    	mButton1.setOnClickListener (new View.OnClickListener() {	
                                    		public void onClick(View v) {
                                    			mListViewAll.setVisibility(View.GONE);
                                    			if(mListViewAll.isShown()){
                                    				mListViewAll.setVisibility(View.GONE);
                                    			}
                                    			else{
                                    				mListViewAll.setVisibility(View.VISIBLE);
                                    			}
                                    		}
                                    	});
                                    	new AsyncDownload().execute();
                                    	return v;
                                    }
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                      4 août 2012 à 11:58:29

                                      Ha ok moi je pensais que je pouvais faire comme ça, vu que là il n'y a qu'un seul bouton mais après il y en aura plusieurs et en fonction du bouton sur lequel je clique, je dois afficher une liste différente en fait, donc je comptais passer des paramètres en fonction du onClick :p

                                      Et en orienté objet ça va encore j'ai lu la partie dans l'énorme bouquin php donc je comprend ce qui se passe mais bon faut que je m'y adapte ^^

                                      Tient par contre ce qui est bizarre c'est que je ne sais plus cacher ma vue quand elle est ouverte et pourtant le code est le même :s

                                      et j'ai une question, vu que je ne peux pas mettre dans le onClick, comment je fais pour lier l'utilisation de certaines valeurs en fonction du bouton? vu que je dois rentrer des paramètres dans ma requête http mais que ça passe par l'utilisation de la fonction principale? :s
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        4 août 2012 à 19:25:06

                                        Alors, je vois un peu mieux ce que tu comptes faire et je vais te proposer une méthode bien plus simple. Pourquoi ne pas avoir une multitude de boutons (autant que tu en as besoin) et qu'une seule ListView que tu alimenteras en fonction du bouton sur lequel tu cliques. Il te suffira d'aller chercher les éléments via une requête HTTP en enlevant ceux de l'état précédent. (Il y a certainement une méthode clear sur l'adaptateur qui te permettra d'enlever ses items à chaque fois).

                                        Mais pour répondre à tes questions, c'es normal. Quand tu cliques sur ton bouton, tu demandes à ta liste de devenir invisible de toute façon. Après tu testes s'il est invisible ou non et tu avises en fonction de. Mais comme il est toujours invisible, il ira toujours dans la condition de cet état. Il faut que tu fasses ça comme pour l'exécution du thread secondaire, à part. Dans ta méthode onClick, tu n'auras que la condition.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                          5 août 2012 à 10:04:10

                                          Et c'est possible de la faire s'afficher en-dessous du bouton que je veux (c'est ça le problème en fait ^^).
                                          J'aime cet effet de "déroulement" comme dans l'app mail de samsung :p
                                          Par contre c'est là que je ne comprend pas trop comment tu peux lier une requête http différente si je suis obligé de mettre l'exécution de ma classe indépendamment du clique?
                                          Cela voudrait dire que je dois sortir ma méthode de connexion http de la classe créé pour la récupération des données et à chaque clique j'appel la fonction http et en-dessous le parsing?

                                          J'ai vu ce que tu voulais dire, sans doute une crasse qui traine d'une des nombreuses modification ^^
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 août 2012 à 8:52:32

                                            Citation : vangoeth

                                            Et c'est possible de la faire s'afficher en-dessous du bouton que je veux (c'est ça le problème en fait ^^).


                                            Oui, c'est possible mais c'est un peu du bidouillage alors. Vaut mieux pas se lancer là dedans.

                                            Citation : vangoeth

                                            Par contre c'est là que je ne comprend pas trop comment tu peux lier une requête http différente si je suis obligé de mettre l'exécution de ma classe indépendamment du clique?


                                            Pourquoi pas exécuter toutes des classes asynchrones à la fin de ta méthode onCreate pour alimenter toutes tes ListView ?

                                            Citation : vangoeth

                                            Cela voudrait dire que je dois sortir ma méthode de connexion http de la classe créé pour la récupération des données et à chaque clique j'appel la fonction http et en-dessous le parsing?


                                            Je fais un effort mais j'ai rien pigé à cette phrase. ^^
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                              6 août 2012 à 9:43:51

                                              J'avoue que la dernière phrase était tordue ^^
                                              Bon en fait je pense faire 2 grosses "fonctions" dans mon webservice, celle qui récupère les valeurs à mettre dans la listView, et ensuite celle qui en fonction de l'item cliqué dans la listView renverra un tableLayout (je pense que c'est le mieux pour gérer l'affichage en tableau ^^).
                                              Donc ça me fait 2 url différents ensuite bah en fonction des choix (dans un premier temps de la période ensuite de la revues) je passe des variables différentes via mon http.

                                              En sois avec tout ça il y aurait moyen de s'en sortir avec une seul class de connexion http et parsing d'après moi (bon c'est peut-être chaud mais me semble que c'est plus propre :p)

                                              Citation : AndroWiid

                                              Pourquoi pas exécuter toutes des classes asynchrones à la fin de ta méthode onCreate pour alimenter toutes tes ListView ?



                                              J'appel la même class tout le temps mais avec des arguments différents?
                                              C'est là que je cale en fait, comment appeler la bonne class vu qu'elle n'est pas dans la condition? A ce moment là je n'ai plus un seul adapter alors si je comprend bien? ^^
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                7 août 2012 à 9:46:20

                                                Je pense que ma question est passée entre les mailles du filet ^^
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  7 août 2012 à 21:50:51

                                                  Citation : vangoeth

                                                  J'appel la même class tout le temps mais avec des arguments différents?


                                                  A toi de voir, soit tu fais une classe mais avec plusieurs conditions soit tu crées une classe interne pour chaque bouton.

                                                  Citation : vangoeth

                                                  C'est là que je cale en fait, comment appeler la bonne class vu qu'elle n'est pas dans la condition?


                                                  Quelle condition ?

                                                  Citation : vangoeth

                                                  A ce moment là je n'ai plus un seul adapter alors si je comprend bien? ^^


                                                  Tu n'as plus d'adaptateur ? Bah si. o_O
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                                    7 août 2012 à 22:03:59

                                                    Je veux dire par là le onClick ^^
                                                    Je peux pas le mettre dedans donc comment je le lie à un bouton?

                                                    Par contre je comprend pas trop ton <void, void, void> et comment passer les paramètres (ni pour la fonction dans un autre tread :s).

                                                    Tu serais vite m'expliquer pasque je cale un peu :s

                                                    Et je voulais dire que j'aurai plusieurs adapteur :p
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 août 2012 à 9:32:03

                                                      Si j'ai bien compris le résultat final que tu tentes d'accéder, tu dois alimenter la liste par des boutons. Dans cette solution, il te suffit que d'une seule liste et un seul adaptateur que tu alimentes au clique des différents boutons. Si tu choisis de créer autant de classe interne que de boutons, il te suffit de rajouter l'évènement clique à chaque bouton que tu re-diriges vers la classe désirée.

                                                      Pour AsyncTask, c'est un peu spécial. C'est ce qu'on appel des types génériques qui se compte au nombre de 3. En voici les significations :
                                                      • 1. Type des paramètres fournis à la tâche. Par exemple, si tu donnes un String, ta méthode background s'attendra à recevoir un ou plusieurs string lorsque tu lanceras le thread (new MyAsyncTask().execute("string1", "string2");).
                                                      • 2. Type de données transmises durant la progression du traitement. Il est possible de gérer une barre de progression gare à une méthode que tu redéfinies dans la classe (protected void onProgressUpdate(Integer... values)). Si c'est un Integer (comme le montre l'exemple précédent et comme c'est souvent le cas), ta méthode s'attendra à recevoir un ou plusieurs int.
                                                      • 3. Type du résultat de la tâche. C'est à dire ce que retourne ta méthode protected Void doInBackground(String... params) si tu veux qu'elle retourne quelque chose. Là elle ne retourne rien.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                                        8 août 2012 à 10:16:24

                                                        Ok pour le click ça c'est pas compliqué :p
                                                        Par contre c'est pour lier le click à la méthode qui me pose problème, tu vois j'avais mi l'appel de la méthode
                                                        MyAsyncTask().execute()
                                                        
                                                        dans le onClick justement, mais comme tu le dis (et ce qui est très logique) c'est qu'à chaque click sur le bouton il va recharger la liste.
                                                        J'ai une idée en tête mais c'est crade :p, c'est à chaque clique sur le bouton on commence par un reset de la list puis on appel la méthode (je vois pas d'autre solution comme ça :s).

                                                        Et pour la 2ème partie, je suppose que si je veux passer des paramètres comme par exemple l'url, et les post je dois passer par le
                                                        MyAsyncTask().execute("192.168.x.x", "vers_l'avenir")
                                                        
                                                        ? et ensuite dans la méthode en elle-même, je met aussi le nom des paramètres du style
                                                        public class AsyncDownload extends AsyncTask<url, nom, void, void>
                                                        
                                                        ? (j'ai essayé comme ça mais apparemment ça fonctionne pas :s)
                                                        Et ensuite dans la méthode je sais récupérer ces variables? ^^

                                                        J'essaye de m'y retrouver j'espère que je m'en sort bien xD
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          8 août 2012 à 19:04:22

                                                          Je pense qu'on commence doucement à y arriver. :)

                                                          Pour ta question sur l'alimentation de ton adaptateur, il y a deux solutions :
                                                          • Celle que tu proposes qui consiste à vider ton adaptateur pour la remplir de nouveaux items (voire les mêmes) à chaque clique.
                                                          • Soit faire un système de cache où tu as une ArrayList par liste que tu désires pour retenir les infos.
                                                          La seconde solution étant plus compliquée, je te conseille la première qui n'est pas mauvaise.

                                                          L'utilisation que tu désires pour lancer ta tâche asynchrone est bonne mais pas la déclaration. Ce que tu veux se caractérise de la façon suivante :
                                                          @Override
                                                          protected void onCreate(Bundle savedInstanceState) {
                                                          	super.onCreate(savedInstanceState);
                                                          	// setContent etc
                                                          	// ...
                                                          	String url = "";
                                                          	String versAvenir = "";
                                                          	new AsyncDownload().execute(url, versAvenir);
                                                          	// ...
                                                          }
                                                          
                                                          // Mon premier paramètre générique est un String pour mes paramètres url et versAvenir
                                                          public class AsyncDownload extends AsyncTask<String, Void, Void> {
                                                          
                                                          	@Override
                                                          	protected Void doInBackground(String... params) {
                                                          		String url = params[0]; // récupère l'url
                                                          		String versAvenir = params[1]; // récupère vers avenir
                                                          		return null;
                                                          	}
                                                          	
                                                          	// ...
                                                          }
                                                          
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
                                                            8 août 2012 à 19:10:27

                                                            Parfait ça, je devrais pouvoir avancer bcp plus vite maintenant ^^
                                                            Je te tiens au courant du fonctionnement ^^

                                                            Merci en tout cas :p
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              8 août 2012 à 19:14:30

                                                              Marque ton sujet en résolu et crée un nouveau topic lorsque tu auras une nouvelle question histoire de pas faire un topic sur plusieurs sujets et long d'une dizaine de pages. :)

                                                              Sinon, de rien, c'est un plaisir.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.

                                                              [Android] Problème Mise en place Webservice

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown