Aller au contenu

[RESOLU] Handler, thread et Hashmap


bioslord

Recommended Posts

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

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...