steph68 Posté(e) 12 septembre 2012 Share Posté(e) 12 septembre 2012 Hello! Je débute sous Android et je me suis fait une petite appli basé sur les Google API 2.1. A ce moment là je ne savais pas encore qu'il fallait séparer les accès réseaux de l'UI. Depuis j'ai corrigé le tir avec des classes Async et Google API 4.0. Mais je bute sur un problème que je n'arrive pas à résoudre! -> 1 AutoCompleteTextView sur mon champs ville AVANT (2.1): public void onTextChanged(CharSequence s, int start, int before, int count) { String result = null; InputStream is = null; List<String> r = new ArrayList<String>(); if (ville.enoughToFilter()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)! { //établissement de la connexion http is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText()); //récup des data brutes ~> string result = lectureData(is); //décodage JSON de l'input stream try { //remplissage DATA JSONArray jArray = new JSONArray(result); JSONObject json_data=null; for(int i=0;i<jArray.length();i++) { json_data = jArray.getJSONObject(i); r.add(json_data.getString("VILLE")); a_idVil.add(json_data.getString("CLEF_VILLE")); } ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,r)); ville.setOnItemSelectedListener(new villeListener()); } catch(JSONException e1) { Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show(); Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--"); } catch(ParseException e1) { Toast.makeText(getBaseContext(),e1.toString() ,Toast.LENGTH_LONG).show(); Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--"); } } } public class villeListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) { villePosition = pos; } public void onNothingSelected(AdapterView<?> arg0) { } } fonctionnement 100% normal: -> à partir du 4ème caractère saisi, une rqt est lancée en base pour trouver toutes les villes débutant par ces 4 caractères + affichage en liste, avec sélection de la bonne ville :) -> le listener affecte bien l'indice de la ville choisie dans la liste :) APRES (4.1): public void onTextChanged(CharSequence s, int start, int before, int count) { if (ville.enoughToFilter()) //REQUETE uniquement à partir de 'n' caractères saisis (= 4 ici dans threshold dans .XML)! { new RemplirVille().execute(BASE_URL + "ville.php?ville=" + ville.getText()); Log.d("***********","AVANT"); ville.setOnItemSelectedListener(new villeListener()); Log.d("***********","APRES"); } } public class villeListener implements OnItemSelectedListener { public void onItemSelected(AdapterView<?> parent, View v, int pos, long row) { villePosition = pos; Log.d("*************9999999", "1111111111"); } public void onNothingSelected(AdapterView<?> arg0) { } } class RemplirVille extends AsyncTask<String, String, List<String>> { Integer errorMsgId; String errorMsgParam; protected List<String> doInBackground(String... param) { List<String> listeAffichageVille = new ArrayList<String>(); ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(param[0]); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); if (response.getStatusLine().getStatusCode() < 400) { HttpEntity entity = response.getEntity(); String entityStr = EntityUtils.toString(entity); JSONArray json_array = new JSONArray(entityStr); for(int i=0;i<json_array.length();i++) { JSONObject json_ligne = json_array.getJSONObject(i); listeAffichageVille.add(json_ligne.getString("VILLE")); a_idVil.add(json_ligne.getString("CLEF_VILLE")); } } else { Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION http error *****", "--"+response.getStatusLine().toString()+"--"); this.errorMsgId = R.string.http_site_error; listeAffichageVille = null; } } catch (Exception ex) { Log.d("***** TestActivity/ASYNC RemplirVille: EXCEPTION decode error *****", "--"+ex.toString()+"--"); this.errorMsgId = R.string.http_decode_error; this.errorMsgParam = ex.getLocalizedMessage(); listeAffichageVille = null; } return listeAffichageVille; } protected void onprogressUpdate(String... item) { } protected void onPreExecute(List<String> list) { } protected void onPostExecute(List<String> list) { if (list == null) //si NULL alors problème... { if (this.errorMsgId != null) { String msg = TestActivity.this.getString(this.errorMsgId); Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show(); } } else //.. SINON affecter les data à l'adapter! { [b]ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list));[/b] } } } fonctionnement dégradé: -> il faut saisir enoughToFilter + 1 caractères pour afficher la liste des villes débutant par ces 4+1 caractères(?) :( -> on ne passe plus dans le listener(?) :( J'ai déjà reprise le déroulement du code un bon paquet de fois, mais je ne vois pas! Et comme à force je connais trop bien mon source, de toute façon je ne lis plus vraiment, je survole! En fait enoughToFilter fonctionne bien, il déclenche bien l'exécution de la classe RemplirVille, qui fait bien son taff aussi (rqt, data ok) sauf que l'affichage de la liste des villes ne se fait pas! Du coup, comme la liste ne s'affiche pas, on saisi 1 car de plus: -> enoughToFilter toujours ok puisqu'on est à min+1 -> RemplirVille refait la rqt, ramène encore une fois les data.... et cette fois-ci, oh miracle, affiche bien la liste de choix. :huh: Une idée sur la question? :P Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 13 septembre 2012 Share Posté(e) 13 septembre 2012 Ta requête asynchrone finit trop tard du coup le premier coup rien ne fonctionne car les variables sont encore vide au moment où l'ui est redessiné. Je suis pas certain mais ça semble logique. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 13 septembre 2012 Auteur Share Posté(e) 13 septembre 2012 J'avais pensé à cette piste en effet, sauf qu'au deuxième passage j'ai bien le résultat correspondant à (nb_car_min+1), et non (nb_car_min) du 1er passage. Sinon, éventuellement, comment ralentir le main pour laisser + de temps l'async? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 13 septembre 2012 Share Posté(e) 13 septembre 2012 L'asynchronisme ne devrait pas influer sur le (bon) fonctionnement. D'ailleurs, j'ai fait un rapide test, et ça fonctionne très bien dès le treshold atteint. Le problème doit être ailleurs. Mais j'avoue ne pas voir où... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 13 septembre 2012 Share Posté(e) 13 septembre 2012 (modifié) Ca apporte quoi l'utilisation d'une "AsyncTask" comparé à un thread ? Modifié 13 septembre 2012 par djeman Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 14 septembre 2012 Auteur Share Posté(e) 14 septembre 2012 chpil: bien d'accord avec toi sur le fait que l'asynchro ne doit pas influer, mais quant à ton test, alors là.............. :( djeman: avec Async tu ne gères pas les thread , c'est la classe qui s'en occupe :P , c'est transparent quoi Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
deep21 Posté(e) 14 septembre 2012 Share Posté(e) 14 septembre 2012 (modifié) Salut, Si je peux me permettre, etant donné que tu débute android, pourquoi ne pas utiliser les thread et comprendre le fonctionnement de ce dernier au lieu d'utiliser AsynTask qui fait la même chose, en plus simple je suppose. Va voir mes posts, d'ailleur tu verra que c'est un peu similaire, au passage merci à djeman toujours la pour aider Modifié 14 septembre 2012 par deep21 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 14 septembre 2012 Share Posté(e) 14 septembre 2012 Merci deep21 mais n'oublies pas chpil, si je ne t'aurai pas aidé il aurait été là comme il l'est depuis le début :) Sinon ton AsyncTask qui doit gérer tout seul l'event de fin de background task à l'air d'être foireux ... à part si ta liste serait vide le 1er coup ? Wé t'as pas mis de message d'erreur si la liste est vide, ton asynctask se finit sans rien faire si c'est le cas. Je suis d'accord avec toi qu'elle ne devrait pas être vide mais parfois les trucs qui gèrent auto font des trucs étranges. Et un thread n'est pas dur à gérer sur ce genre de tache asynchrone, il te faut juste un handler dans ta classe pour récupérer le signal de fin de ton thread et s'en servir pour afficher les infos dans ton adapter (Car comme tu l'as compris le thread principal et le thread de rendu de l'ui). Si tu ne trouves pas le soucis de ton AsyncTask ça peut être une solution de rechange. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 14 septembre 2012 Auteur Share Posté(e) 14 septembre 2012 J'ai logué absolument tous mes paramètres, dont la liste, et il sont TOUS (liste data comprise) parfaitement initialisés avec les bonnes data. :P J'ai déjà testé tout ce que je voyais de "logique". :( Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 14 septembre 2012 Share Posté(e) 14 septembre 2012 Bon résumons, tout fonctionne et quand tu mets un breakpoint sur setadapter il est bien exécuté à chaque fois qu'il le devrait avec une liste contenant des données ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 17 septembre 2012 Auteur Share Posté(e) 17 septembre 2012 (modifié) Alors, pour les détails: 1) j'ai entouré la ligne ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list)); par deux log Log.d("AVANT"); ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,list)); Log.d("APRES"); 2) ces 2 log sont bien lancés 2 fois -> threshold -> threshold + 1 3.) j'ai aussi logué les paramètres du setAdapter: -> list: contient bien les bonnes data lors des 2 passages (villes débutant par xxx 1ère fois, et xxxx la 2ème) -> android.R.layout.simple_selectable_list_item: bon ben là rien à dire, constante android -> TestActivit.this: j'ai aussi testé tous les contextes possibles (getbasecontext, getapplicationcontext, etc...) et j'ai même déclaré une globale Context que j'initialise au début du onCreate pour être 100% sûr Mais le résultat est malheureusement toujours le même. :o Modifié 17 septembre 2012 par steph68 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 17 septembre 2012 Share Posté(e) 17 septembre 2012 (modifié) Ben donc ton asynctask est foireuse ... ne me demande pas pourquoi j'en sais rien mais si tu me dis que setadapter est bien exécuté avec les bonnes variables ... ah t'as oublié de me dire un truc, ville est bien initialisé ? Wé je te demande ça car il ne reste plus beaucoup le choix, soit ville n'est pas initialisé avec la bonne textview soit ça ne s’exécute pas sur le bon thread. Le fait que t’exécute un event dans un autre peut peut-être foutre le bordel. Je te le redis, test un thread au lieu de l'asynctask, le nom fait peut etre peur mais t'es pas en c++ et comme deep21 te l'a dit on a plein d'exemple simple sous la main. Parfois faut savoir utiliser un autre système quand celui qu'on souhaite utiliser ne fait pas ce qu'on veut. Edit: Correction: Pas un event dans l'autre, je voulais dire ton asynctask à partir d'un event. Modifié 17 septembre 2012 par djeman Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 18 septembre 2012 Auteur Share Posté(e) 18 septembre 2012 (modifié) Oui, j'ai logué toutes les data envoyées à l'adapter, comme expliqué ci-dessus: list = ville pour ta correction: j'ai le même principe d'Async pour remplir des spinner et no soucy :huh: Modifié 18 septembre 2012 par steph68 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 18 septembre 2012 Auteur Share Posté(e) 18 septembre 2012 Ok j'ai fait un test avec un thread: -> méthode run() quasi identique à doItInBackground() de Async: ok class RemplirVille2 extends Thread { private String URL; public RemplirVille2(String url) { this.URL = url; } public void run() { ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); if (response.getStatusLine().getStatusCode() < 400) { HttpEntity entity = response.getEntity(); String entityStr = EntityUtils.toString(entity); JSONArray json_array = new JSONArray(entityStr); for(int i=0;i<json_array.length();i++) { JSONObject json_ligne = json_array.getJSONObject(i); listeAffichageVille.add(json_ligne.getString("VILLE")); a_idVil.add(json_ligne.getString("CLEF_VILLE")); } } else { this.errorMsgId = R.string.http_site_error; listeAffichageVille = null; } } catch (Exception ex) { this.errorMsgId = R.string.http_decode_error; this.errorMsgParam = ex.getLocalizedMessage(); listeAffichageVille = null; } Log.d("******* FIN RUN", "("+listeAffichageVille+")"); } } -> avec en global, comme être accessible depuis thread & UI Integer errorMsgId; String errorMsgParam; List<String> listeAffichageVille = new ArrayList<String>(); -> et tu sais quoi??? exactement pareil!!! :emo_im_foot_in_mouth: ????????????? la preuve est donc faite que ce n'est pas lié à l'asynchrone ou au thread....... mais alors ******* de ******** de ******* d'où ça vient? c'est totalement fou! ok, en rajoutant une boucle while alive la liste s'affiche correctement: public void onTextChanged(CharSequence s, int start, int before, int count) { if (ville.enoughToFilter()) { RemplirVille2 thread = new RemplirVille2(BASE_URL + "ville.php?ville=" + ville.getText()); thread.start(); while (thread.isAlive()) { //rien, juste attendre fin thread pour envoyer la liste à l'adapter //Log.d("******* RUN", ""); } //équivalent du onPostExecute d'Async if (listeAffichageVille == null) //si NULL alors problème... { if (errorMsgId != null) { String msg = TestActivity.this.getString(this.errorMsgId); Toast.makeText(TestActivity.this,msg,Toast.LENGTH_LONG).show(); } } else //.. SINON affecter les data à l'adapter! { ville.setAdapter(new ArrayAdapter<String>(TestActivity.this,android.R.layout.simple_selectable_list_item,listeAffichageVille)); } } } public void onItemSelected(AdapterView<?> parent,View v, int position, long id) { coucou("*****************tata"); villePosition = position; chercher(v); } on avance... même si ça me semble louche quand même... par contre, on n'entre toujours pas dans onItemSelected, bien qu'il soit évidemment défini dans mon UI avec un ville.setOnItemSelectedListener(this); Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 18 septembre 2012 Share Posté(e) 18 septembre 2012 (modifié) Bon c'est pas évident à lire avec l'indentation cassé ^^ Mais là ton thread tu l'utilises mal, on fait jamais de boucle infini sans aucune commande (mini un sleep(1) au milieu) mais effectivement t'as jamais utilisé les threads. Donc c'est "normal" que tu dois mettre cette boucle car un thread par définition c'est asynchrone à part si tu le synchronises avec quelque chose mais là on va pas parler :) Déjà la mise en place du thread, on a plutôt tendance à utiliser "implements Runnable" à la place de "extends Thread" : ... extends Thread– Avantages : Chaque thread a ses données qui lui sont propres. – Inconvénients : On ne peut plus hériter d'une autre classe. ... implements Runnable – Avantages : L'héritage reste possible. – Inconvénients : Les attributs de votre classe sont partagés par tous les threads qui y sont basés (parfois un un avantage) Bon c'est un détail mais pour connaitre la fin de ton thread c'est là que ça ne va pas du tout, ce qu'on utilise le plus couramment est un handler. Donc dans ton activité qui lance le thread tu dois placer un Handler, exemple : public class TestActivity extends Activity { private static final int HANDLER_END_REMPLIR_VILLE = 0; protected static final String BASE_URL = "http://moo.moo"; private AutoCompleteTextView ville; private List<String> a_idVil; private int villePosition = 0; private Message msg = null; private List<String> listVille; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listVille = new ArrayList<String>(); ville.findViewById(R.id.moo); ville.setOnItemSelectedListener(new villeListener()); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case HANDLER_END_REMPLIR_VILLE: if (msg.getData().getString("val").contains("true")) updateTextView(); break; } super.handleMessage(msg); } }; ... public void onTextChanged(CharSequence s, int start, int before, int count) { new Thread(new Runnable() { @Override public void run() { if (ville.enoughToFilter()) { //établissement de la connexion http InputStream is = connexionHttp(BASE_URL + "ville.php?ville=" + ville.getText()); //récup des data brutes ~> string String result = lectureData(is); Bundle data = new Bundle(); data.putString("val", "true"); //décodage JSON de l'input stream try { //remplissage DATA JSONArray jArray = new JSONArray(result); JSONObject json_data=null; for(int i=0;i<jArray.length();i++) { json_data = jArray.getJSONObject(i); listVille.add(json_data.getString("VILLE")); a_idVil.add(json_data.getString("CLEF_VILLE")); } //ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille)); } catch(JSONException e1) { Log.d("***** TestActivity/onTextChanged: JSONException *****", "--"+e1.toString()+"--"); data.putString("val", "false"); } catch(ParseException e1) { Log.d("***** TestActivity/onTextChanged: ParseException *****", "--"+e1.toString()+"--"); data.putString("val", "false"); } msg = handler.obtainMessage(HANDLER_END_REMPLIR_VILLE); msg.setData(data); handler.sendMessage(msg); } } }).start(); } protected void updateTextView() { ville.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille)); } public class villeListener implements OnItemSelectedListener { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { villePosition = position; Log.d("*************9999999", "1111111111"); } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } } ... }; Voila j'ai essayé de te faire l'exemple avec l'handler et pour pas t’embêter à faire passer des bundles par l'handler ben je l'ai laissé dans la classe et je me suis servi du bundle pour savoir si ça a réussi ou non. Bon c'est un exemple pour le handler, le reste t'y fais pas gaffe ! :) Edit: J'ai rajouté la gestion des erreurs de ton thread avec un petit bundle. Edit2: J'ai remis le start sur mon thread qui avait sauté au deuxième copié/collé ^^ Modifié 18 septembre 2012 par djeman 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 18 septembre 2012 Auteur Share Posté(e) 18 septembre 2012 indentations: si le copy/paste fonctionnait bien ici..... :mellow: pour le reste, je vais étudier tout ça. merci. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 18 septembre 2012 Share Posté(e) 18 septembre 2012 Non mais je t'ai rien reproché, je sais que dès qu'on fait une prévisualisation ça l'enlève ... d'où mon soucis qui a fait que j'ai édité 15 fois mon message car je voulais la garder :P Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 18 septembre 2012 Auteur Share Posté(e) 18 septembre 2012 pffffffffffffffffff, commence même a voir peur de poster maintenant............... :( je ne doute pas de vos capacités, ni du fait que vous postez du bon code, mais ICI c'est toujours aussi space! -> j'ai testé ta version -> il passe bien dans le updateTextView() à enoughToFilter mais sans afficher la listview, malgré le ville.setAdapter() -> il y repasse bien à (enoughToFilter+1) et cette fois j'ai bien l'affichage de la listview -> il ne passe pas dans onItemSelected() Bref, ça fait exactement comme "ma" version. Je vais virer maboule!!!!! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 18 septembre 2012 Share Posté(e) 18 septembre 2012 (modifié) Bon on se décourage pas, le test a permis de voir que le problème se situe ailleurs. C'est un truc space quand même car tout devrait fonctionner, t'as pas mis un truc bizarre dans ton manifest ? Pourquoi t'utilises la google api au lieu de l'api classique ? Sinon essayes de tout déclarer d'un coup avant et de te servir du thread pour seulement modifier l'adapter. Style par rapport à mon exemple : private List<String> listVille; private ArrayAdapter<String> aa; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ville = (AutoCompleteTextView) findViewById(R.id.moo); listVille = new ArrayList<String>(); aa = new ArrayAdapter<String>(this,android.R.layout.simple_selectable_list_item,listVille); ville.setAdapter(aa); ville.setOnItemSelectedListener(new villeListener()); } .... protected void updateTextView() { aa.clear(); aa.addAll(listVille); aa.notifyDataSetChanged(); } Là en ayant toute l'initialisation d'un coup au début ça peut peut etre jouer ... mais franchement ça devient inexplicable ton soucis. notifyDataSetChanged est censé forcer le composant hébergeant l'adapter à être redessiné. Modifié 18 septembre 2012 par djeman Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 19 septembre 2012 Auteur Share Posté(e) 19 septembre 2012 - Google API: parce qu'une des fonctionnalité de mon appli gère de la géoloc - modif du code: je vais voir ça merci. Bon ben.......... pareil. Je vais [color=red]qd[/color] même essayer avec l'api 4.1 standard! En attendant, voici le manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bidule.com" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="16" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="com.google.android.maps" /> <!-- activité PRINCIPALE dans le LAUNCHER --> <activity android:name=".TestActivity" android:label="@string/title_activity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- activité FILLE d'affichage des résultats --> <activity android:name=".AfficherListe" android:label="@string/title_activity_afficher_liste" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!-- TEMPORAIRE DEVELOPPEMENT ******************************************************************* --> <activity android:name=".Z_GeolocAfficheCarte" android:label="@string/title_activity_afficher_detail" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".Z_GeolocLatitudeLongitude" android:label="@string/title_activity_afficher_detail" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <!-- TEMPORAIRE DEVELOPPEMENT ******************************************************************* --> <activity android:name=".AfficherListe2" android:label="@string/title_activity_afficher_liste2" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".AfficherDetails" android:label="@string/title_activity_afficher_details" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> </manifest> Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 19 septembre 2012 Auteur Share Posté(e) 19 septembre 2012 (modifié) Bon, j'ai fait mieux niveau test, une samsung galaxy sous android 4.1. -> pareil Donc à priori pas un soucis d'émulateur! Ca nous laisse quoi si l'OS & le code est bon? Autre idée: est ce que l'UI serait trop chargée (bien que les traitements lourds type réseaux soit en Async/Thread) et que certaines lignes de codes ne soient pas exécutées, tout simplement? A mon sens, pas impossible... pourquoi pas... sauf que dans ce cas là, le code skippé devrait être aléatoire, pas systématiquement identique, non? Modifié 19 septembre 2012 par steph68 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 19 septembre 2012 Share Posté(e) 19 septembre 2012 Franchement là je l'admet je comprends pas le soucis ... il faudrait voir le code complet car comme tu le dis quelque chose doit interférer ... Non même si tu chargerais trop ton ui tu ne ferais que la ralentir. T'as essayé en séparant ton bout de code dans une activité externe ? Comme chpil l'avait fait ? Pour voir si le problème vient du code ou de l'environnement de développement ? Environnement et rom de test, car bon je veux pas être méchant sur les roms customs mais il y a beaucoup de bricolage pourri par des gars qui n'y connaissent rien pour quelques unes de bonnes. Sinon tu peux forcer le truc mais ça pourri le code et c'est pas beau et ça se fait pas, en plaçant le setdapter suivi d'un noifydatachanged ... ça se fait pas, ou en tout cas ça ne devrait pas se faire ... ça alourdit le code ... berk ... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 19 septembre 2012 Auteur Share Posté(e) 19 septembre 2012 notifydatachanged: déjà fait séparer le code: fait mais comportement identique -> te dépose le projet qq part en ligne ma version ASYNC originale + THREAD -> et t'envoie le lien en MP par contre, je ne peux pas donner l'URL que j'utilise, donc pour tester utilises: -> soit un tableau de String -> soit une table/requete d'un wamp ou autre Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
djeman Posté(e) 19 septembre 2012 Share Posté(e) 19 septembre 2012 (modifié) J'avais même pas fait gaffe, mais le fonctionnement de ton AutoCompleteTextView est sérieusement dégradé. Au moment où android gère l'autocomplétion pour afficher la liste de choix correspondant aux caractères tout seul ben toi tu lui update l'adapter ... Sinon ça se "met à jour" chez moi, mais bon c'est un peu cagieux car la mise à jour de l'adapter remets à zéro la liste et donc annule l'autocomplétion. Vais regarder de plus près dès que j'ai un peu de temps. Modifié 19 septembre 2012 par djeman Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
steph68 Posté(e) 20 septembre 2012 Auteur Share Posté(e) 20 septembre 2012 mise à jour: OUI -> mais à (enough2filter + 1) pour Async (ok à enough2filter pour Thread -> ET onItemSelected jamais exécuté, Async ou Thread sinon, je ne comprends pas trop ta 2ème phrase.... puisque l'autocomplétion se fait justement par les data de la liste de choix -> à partir de enough2filter, on lance la rqt qui rempli la liste -> liste envoyée à l'adapter -> adapter qui gère l'autocompletion merci. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.