bioslord Posté(e) 19 avril 2011 Share Posté(e) 19 avril 2011 Bonjour, j'utilise jsoup pour peuplé une listview perso. Je faisait donc comme ceci : Document doc = Jsoup.connect(ActuURL).get(); Elements contenu = doc.select("div#contenu"); ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>(); for(Element UneActu : contenu) { String LeTitre = UneActu.select("h2").text(); String LeLien = UneActu.select("a[href]").text(); HashMap<String, String> map; map = new HashMap<String, String>(); map.put("titre", LeTitre); map.put("lien", LeLien); listItem.add(map); } ListView ListViewActu = (ListView) findViewById(R.id.ListViewActu); SimpleAdapter mSchedule = new SimpleAdapter (actu.this, listItem, R.layout.actu_listactu_item, new String[] {"titre", "lien"}, new int[] {R.id.titre, R.id.lien}); ListViewActu.setAdapter(mSchedule); Jusque le , ça marche mais c'est pas dans un Thread, donc sa fige pendant le chargement, et depuis ce matin je ne trouve pas comment faire pour mettre ce thread sans qu'il me dise qu'il à pas le droit de touché au élément de l'interface, et blabla... Donc forcement en faisant ça , ça plante, ce qui est normal ya pas d'Handler private void RecupDataEtTraitement(){ progressDialog.setMessage("Chargement en cours..."); progressDialog.setTitle("Actualisation"); progressDialog.show(); new Thread(new Runnable() { @Override public void run() { try { Document doc = Jsoup.connect(ActuURL).get(); Elements contenu = doc.select("div#contenu"); ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>(); for(Element UneActu : contenu) { String LeTitre = UneActu.select("h2").text(); String LeLien = UneActu.select("a[href]").text(); HashMap<String, String> map; map = new HashMap<String, String>(); map.put("titre", LeTitre); map.put("lien", LeLien); listItem.add(map); } ListView ListViewActu = (ListView) findViewById(R.id.ListViewActu); SimpleAdapter mSchedule = new SimpleAdapter (actu.this, listItem, R.layout.actu_listactu_item, new String[] {"titre", "lien"}, new int[] {R.id.titre, R.id.lien}); ListViewActu.setAdapter(mSchedule); } catch (IOException e) { // TODO Auto-generated catch block Toast.makeText(actu.this, "Réseau ou serveur indisponnible", Toast.LENGTH_SHORT).show(); } progressDialog.dismiss(); } }).start(); } Si je met un Handler, je ne sais plus ou déclarer ma listview, l'array listItem et le SimpleAdapter... Bref c'est sensé etre simple, mais le je vois pas. J'ai besoin d'un coup de pouce :D Merci EDIT: Ma question plus précisément est : Comment mettre un handler pour récupérer les info que je récupère dans le boucle for avec jsoup ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 19 avril 2011 Share Posté(e) 19 avril 2011 Utilise plutôt AsyncTask (qui est en quelque sorte la réunion d'un Thread et d'un Handler) qui te permettra d'implémenter tes traitements en séparant ce qui doit être exécuté dans le thread de l'UI et ce qui doit l'être dans le thread secondaire Ce qui donnerait, dans ton cas: private void RecupDataEtTraitement(){ progressDialog.setMessage("Chargement en cours..."); progressDialog.setTitle("Actualisation"); progressDialog.show(); new AsyncTask<Void,Void,Void>() { private ArrayList<HashMap<String, String>> listItem; protected void doInBackground() { try { Document doc = Jsoup.connect(ActuURL).get(); Elements contenu = doc.select("div#contenu"); listItem = new ArrayList<HashMap<String, String>>(); for(Element UneActu : contenu) { String LeTitre = UneActu.select("h2").text(); String LeLien = UneActu.select("a[href]").text(); HashMap<String, String> map; map = new HashMap<String, String>(); map.put("titre", LeTitre); map.put("lien", LeLien); listItem.add(map); } } catch (IOException e) { // TODO Auto-generated catch block Toast.makeText(actu.this, "Réseau ou serveur indisponnible", Toast.LENGTH_SHORT).show(); } } protected void onPostExecute() { ListView ListViewActu = (ListView) findViewById(R.id.ListViewActu); SimpleAdapter mSchedule = new SimpleAdapter (actu.this, listItem, R.layout.actu_listactu_item, new String[] {"titre", "lien"}, new int[] {R.id.titre, R.id.lien}); ListViewActu.setAdapter(mSchedule); progressDialog.dismiss(); } }).execute(); } La méthode doInBackground, comme son nom l'indique, sera exécutée dans le thread secondaire, et ensuite, onPostExecute sera appelée, dans le thread principal, lorsque le traitement sera terminé Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.