C'est assez simple en fait :
- tu déportes la création et affichage de ta progressDialog dans le onPreExecute de ta tâche
- tu déportes le traitement dans le doInBackground
- tu déportes la fin dans le onPostExecute
C'est assez simple en fait :
- tu déportes la création et affichage de ta progressDialog dans le onPreExecute de ta tâche
- tu déportes le traitement dans le doInBackground
- tu déportes la fin dans le onPostExecute
C'est Android, PAS Androïd, ou Androïde didiou !
Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.
Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.
N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android
Le tutoriel que j'ai mis dans le post précédent est donc suffisant pour ce que je dois en faire ?
Je dirai oui (après rapide coup d'oeil).
C'est Android, PAS Androïd, ou Androïde didiou !
Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.
Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.
N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android
Voilà j'ai tenté de comprendre le phénomène AsyncTask à l'aide du tutoriel que j'ai mis 2 posts avant. J'obtiens ce bout de code qui est le même que celui du tutoriel car je l'ai suivi, jusque là rien de suspect.
Maintenant j'aimerai bien l'appliquer à mon cas, celui des requette HHTP. Pour l'adapter j'ai plus que à mettre ce bout de code:
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 package sdz.Async.com; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.Toast; public class AsyncBigCalculActivity extends Activity { private ProgressBar mProgressBar; private Button mButton; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // On récupère les composants de notre layout mProgressBar = (ProgressBar) findViewById(R.id.pBAsync); mButton = (Button) findViewById(R.id.btnLaunch); // On met un Listener sur le bouton mButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { BigCalcul calcul=new BigCalcul(); calcul.execute(); } }); } private class BigCalcul extends AsyncTask<Void, Integer, Void> { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(getApplicationContext(), "Début du traitement asynchrone", Toast.LENGTH_LONG).show(); } @Override protected void onProgressUpdate(Integer... values){ super.onProgressUpdate(values); mProgressBar.setProgress(values[0]); } @Override protected Void doInBackground(Void... arg0) { int progress; for (progress=0;progress<=100;progress++) { for (int i=0; i<1000000; i++){} //la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate publishProgress(progress); progress++; } return null; } @Override protected void onPostExecute(Void result) { Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show(); } } }
Dans la fonction ???
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 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); progressDialog.setMessage("Chargement en cours"); progressDialog.show(); try { HttpClient httpclient = new DefaultHttpClient(); String url = "http://www.test.com/test.php"; HttpPost httppost = new HttpPost(url); nameValuePairs.add(new BasicNameValuePair("codepostal", codePostal)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); json= new JSONObject(EntityUtils.toString(response.getEntity())); jArray1 = json.getJSONArray("requete1"); } catch (Exception ex) { // signaler l'erreur Log.e("MyAppTag","Erreur réception données", ex); Toast.makeText(getBaseContext(),ex.getLocalizedMessage(),Toast.LENGTH_LONG).show(); // ou throw new Exception(); si il faut signaler l'erreur à l'appelant ! }
Je vous remercie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 protected Void doInBackground(Void... arg0) { int progress; for (progress=0;progress<=100;progress++) { for (int i=0; i<1000000; i++){} //la méthode publishProgress met à jour l'interface en invoquant la méthode onProgressUpdate publishProgress(progress); progress++; } return null; }
Essaye, tu verras bien
Nous sommes-là pour t'aider, mais là, à part essayer, je vois mal comment t'aider autrement qu'en te faisant tout le code à ta place, ce qui n'est plus de l'entraide, mais du travail.
PS : comme d'hab', réfléchis à ce que tu fais, et comprends-le
C'est Android, PAS Androïd, ou Androïde didiou !
Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.
Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.
N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android
Oui enfin je viens de découvrir AsyncTask il y a 2h à tout cassé. Donc tout comprendre n'est pas évident. Meric quand même
Le probleme du tutoriel, c'est qu'il montre une progress bar dans une async task... ce qui n'est pas forcément ce que tu cherches (dans le code, il n 'y a pas de progress défini).
Donc l'idée est de partir d'une AsyncTask "vide" (franchement, si tu comprends la logique des appels, tu n'as pas besoin de tuto pour remplir les deux fonctions nécessaires: doInBackground, onPostExecute)...
D'autre part, je suis de l'avis d'Hizin, de mettre l'affichage de la "boite de progression" (juste le petit truc qui tourne quoi avec un message) dans l'AsyncTask elle même...
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
Es-ce que cela est juste ? Ou j'ai fais une erreur.
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 private class BigCalcul extends AsyncTask<Void, Integer, JSONArray> { @Override protected void onPreExecute() { super.onPreExecute(); //Toast.makeText(getApplicationContext(), "Début du traitement asynchrone", Toast.LENGTH_LONG).show(); progressDialog.setMessage("Chargement en cours"); progressDialog.show(); } @Override protected void onProgressUpdate(Integer... values){ super.onProgressUpdate(values); } @Override protected JSONArray doInBackground(Void... arg0) { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); try { HttpClient httpclient = new DefaultHttpClient(); String url = "http://www.test.com/test.php"; HttpPost httppost = new HttpPost(url); nameValuePairs.add(new BasicNameValuePair("codepostal", codePostal)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); json= new JSONObject(EntityUtils.toString(response.getEntity())); jArray1 = json.getJSONArray("requete1"); } catch (Exception ex) { // signaler l'erreur Log.e("MyAppTag","Erreur réception données", ex); Toast.makeText(getBaseContext(),ex.getLocalizedMessage(),Toast.LENGTH_LONG).show(); // ou throw new Exception(); si il faut signaler l'erreur à l'appelant ! } return jArray1; } @Override protected void onPostExecute(JSONArray result) { //Toast.makeText(getApplicationContext(), "Le traitement asynchrone est terminé", Toast.LENGTH_LONG).show(); progressDialog.dismiss(); } }
Car le problème c'est que je ne sais pas comment récupérer le JSONArray pour le traiter avec l'adapter ensuite.
Voici l'appel:
et de cette manière je ne sais pas comment récupérer le JSONArray pour pouvoir ensuite le passer à mon adapter. J'ai donc bien le cercle de chargement etc.. Mais je n'arrive pas récupérer le JSONArray et j'ai donc un résultat vide, rien ne s'affiche ce qui est normal puisque je récupère pas le JSONArray qui est construit de l'AsyncTask
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 BigCalcul calcul=new BigCalcul(); calcul.execute();
Je vous remercie.
Déjà, vire le "onProgressUpdate" qui ne sert à rien...
J'imagine que ta classe est déclarée comme fille d'une activité non ?
Dans l'idéal ta classe devrait hériter de AsyncTask<NameValuePair, Void, JSONArray>
Code java : 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 public class MonActivity extends Activity { ... ProgressDialog progressDialog; class BigCalcul extends AsyncTask<NameValuePair,Void,JSONArray> { @Override protected void onPreExecute() { super.onPreExecute(); MonActivity.this.progressDialog.setMessage("Chargement en cours"); MonActivity.this.progressDialog.show(); } @Override protected JSONArray doInBackground(NameValuePair ... params) { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); if (params != null) { for (NameValuePair p : params) nameValuePairs.add(p); } //... le reste a l'air bon ... } @Override protected void onPostExecute(JSONArray result) { MonActivity.this.progressDialog.dismiss(); if (result != null) MonActivity.this.onBigCalculResult(result); } } public void startBigCalcul(String codePostal) { BigCalcul back = new BigCalcul(); back.execute(new NameValuePair("codepostal",codePostal)); } public void onBigCalculResult(JSONArray array) { // mise à jour de l'adapter } }
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
Mais dans le code que tu me proposes tu fais ou la raquette HTTP Post ?
dans le doInBackground... là ou il y a le commentaire, j'ai même mis comment passer des paramètres
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
cependant je ne comprend pas comment on récupère le JSONArray qui sera passé à la fonction suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void onBigCalculResult(JSONArray array)
Alors, là, c'est moi qui ne comprend pas la question.... les JSONArray est passé en paramètre à une fonction de l'activité...
Tu veux le récupérer ou ?
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
autant pour moi j'avais mal lu le code (j'avais pas vu le accolade comme ça). Je vais essayer donc.
Essayant d'intégrer le code j'au toujours un problème, voici mon code:
Cependant Eclipse ne reconnait pas BigCalcul et me demande donc de créer une classe etc... Mais BigCalcul est déjà présent dans la mon activité comme vous pouvez le constater. Je ne comprend donc 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
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 package com.restomaniak.alpha; import java.util.ArrayList; 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.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Typeface; import android.location.Location; import android.os.AsyncTask; import android.os.Bundle; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.SpannedString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class RestoListe extends Activity { private static int CODE_DE_MON_ACTIVITE = 2; private String codePostal = new String(); private String id_Resto= new String(); private String nomResto = new String(); private float bundleLong = 0; private float bundleLat = 0; private float longFloat = 0; private float latFloat = 0; private ProgressDialog progressDialog; private ListView list = null; private String nomVille = new String(); private JSONArray jArray1 = new JSONArray(); private Typeface robotoBold = null; private JSONObject json = null; private TextView jeSouhaite = null; private TextView allerManger = null; private TextView a = null; private TextView village = null; private TextView surPlaceEmporteLivraison = null; private TextView desole = null; private TextView aucunResultat = null; private Button retournerPageAcceuil = null; private Location locationDetecter = new Location("Detecter"); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listeresto); progressDialog = new ProgressDialog(this); //On met l'application en plein écran getWindow().setFormat(PixelFormat.TRANSLUCENT); robotoBold = Typeface.createFromAsset(getAssets(), "Roboto_Bold.ttf"); //On récupère les données du Bundle Bundle objetbunble = this.getIntent().getExtras(); if (objetbunble !=null && objetbunble.containsKey("Valeur")) { codePostal = this.getIntent().getStringExtra("Valeur"); } else { //Erreur codePostal = "0"; } if (objetbunble !=null && objetbunble.containsKey("nomVille")) { nomVille = this.getIntent().getStringExtra("nomVille"); } else { //Erreur nomVille = "Error"; } if (objetbunble !=null && objetbunble.containsKey("Longitude")) { bundleLong = this.getIntent().getFloatExtra("Longitude", 0); } else { //Erreur bundleLong = 0; } if (objetbunble !=null && objetbunble.containsKey("Latitude")) { bundleLat = this.getIntent().getFloatExtra("Latitude", 0); } else { //Erreur bundleLat = 0; } locationDetecter.setLongitude(bundleLong); locationDetecter.setLatitude(bundleLat); if (objetbunble != null && objetbunble.containsKey("BoutonLivraison")) { //BigCalcul calcul=new BigCalcul(); //calcul.execute(); class BigCalcul extends AsyncTask<NameValuePair,Void,JSONArray> { @Override protected void onPreExecute() { super.onPreExecute(); RestoListe.this.progressDialog.setMessage("Chargement en cours"); RestoListe.this.progressDialog.show(); } @Override protected JSONArray doInBackground(NameValuePair ... params) { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); if (params != null) { for (NameValuePair p : params) nameValuePairs.add(p); } try { HttpClient httpclient = new DefaultHttpClient(); String url = "http://www.test.com/test.php"; HttpPost httppost = new HttpPost(url); nameValuePairs.add(new BasicNameValuePair("codepostal", codePostal)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); json= new JSONObject(EntityUtils.toString(response.getEntity())); jArray1 = json.getJSONArray("requete1"); } catch (Exception ex) { // signaler l'erreur Log.e("MyAppTag","Erreur réception données", ex); Toast.makeText(getBaseContext(),ex.getLocalizedMessage(),Toast.LENGTH_LONG).show(); // ou throw new Exception(); si il faut signaler l'erreur à l'appelant ! } return jArray1; } @Override protected void onPostExecute(JSONArray result) { RestoListe.this.progressDialog.dismiss(); if (result != null) RestoListe.this.onBigCalculResult(result); } } } } public void onBigCalculResult(JSONArray result) { // TODO Auto-generated method stub //Appel de mon adapter } public void startBigCalcul(String codePostal) { BigCalcul back = new BigCalcul(); back.execute(new NameValuePair("codepostal",codePostal)); } }
Je vous remercie beaucoup,
Italia57
Heu... la tu déclare BigCalcul dans une FONCTION !
Faut le mettre au niveau de la classe !
N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
Et surtout
Oups... Erreur corrigé.
J'ai encore un problème à ce niveau:
Eclipse me souligne NameValuePair et me donne comme message:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public void startBigCalcul(String codePostal) { BigCalcul back = new BigCalcul(); back.execute(new NameValuePair("codepostal",codePostal)); }
"Cannot instantiate the type NameValuePair"
Je te remercie
EDIT: j'ai mis BasicNameValuePair et Eclipse est content donc tant mieux. Seulement après pour appeler après dans onCreate cette classe, je mets ces deux lignes là ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 BigCalcul calcul=new BigCalcul(); calcul.execute();
Oui les asyncTask nous facilite la vie pour gérer des processus en tache de fond (doInBackground).
L'utilisation des ProgressBar sont tres facile à utiliser avec ce genre de chose mais apres tt dépend de tes besoins car asynctask n'est pas utilisable sur tout processus.
Par exemple il n'aime vraiment l'utilisation de boucle infinie, si tu en as, je te conseil d'utiliser des threads mais plus dur a coder.
je vois ça mais je peine encore à les utiliser.
Aurez-vous la réponse à ma question du post précédent ?
EDIT: Voici ce que j'ai à présent
Et dans la fonction onCreate à l'endroit ou j'en ai besoin je fais:
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 ProgressDialog progressDialog; class BigCalcul extends AsyncTask<NameValuePair,Void,JSONArray> { @Override protected void onPreExecute() { super.onPreExecute(); RestoListe.this.progressDialog.setMessage("Chargement en cours"); RestoListe.this.progressDialog.show(); } @Override protected JSONArray doInBackground(NameValuePair ... params) { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); if (params != null) { for (NameValuePair p : params) nameValuePairs.add(p); } try { HttpClient httpclient = new DefaultHttpClient(); String url = "http://www.test.com/test.php"; HttpPost httppost = new HttpPost(url); nameValuePairs.add(new BasicNameValuePair("codepostal", codePostal)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); json= new JSONObject(EntityUtils.toString(response.getEntity())); jArray1 = json.getJSONArray("requete1"); } catch (Exception ex) { // signaler l'erreur Log.e("MyAppTag","Erreur réception données", ex); Toast.makeText(getBaseContext(),ex.getLocalizedMessage(),Toast.LENGTH_LONG).show(); // ou throw new Exception(); si il faut signaler l'erreur à l'appelant ! } return jArray1; } @Override protected void onPostExecute(JSONArray result) { RestoListe.this.progressDialog.dismiss(); if (result != null) RestoListe.this.onBigCalculResult(result); } } public void onBigCalculResult(JSONArray result) { // TODO Auto-generated method stub //Création et initialisation de l'Adapter pour les personnes AdapterPersoLivraison adapterProut = new AdapterPersoLivraison(this, result); //Récupération du composant ListView list = (ListView)findViewById(R.id.listResto); //Initialisation de la liste avec les données list.setAdapter(adapterProut); } public void startBigCalcul(String codePostal) { BigCalcul back = new BigCalcul(); back.execute(new BasicNameValuePair("codepostal",codePostal)); }
Si cela est juste, c'est qu'il y a quand même une erreur car j'ai un FC.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 BigCalcul calcul=new BigCalcul(); calcul.execute();
Voici mes erreurs:
et:
Désolé pour les deux posts consécutifs.
J'ai donc passer presque ma nuit entière à chercher ce problème (car je dois faire un truc mal bien évidemment) et je n'ai pas trouvé.
Si quelqu'un aurait la solution je suis donc preneur.
Grosse prime à celui qui pourra m'aider à faire fonctionner les AsyncTask .
Je vous remercie.
Italia57
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager