Après être passé en mode debug mon code passe directement de
àCode:Thread thread = new Thread(new Runnable() {
Code:});thread.start();
Version imprimable
Après être passé en mode debug mon code passe directement de
àCode:Thread thread = new Thread(new Runnable() {
Code:});thread.start();
Bonjour,
je te conseille de lire ce tutoriel pour utiliser des Threads ;)
http://mathias-seguy.developpez.com/...async_memleak/
Oui parce que le code (à l’extérieur du thread) est exécute immédiatement, avant même que le thread n'aie pu vraiment démarrer...
Donc la liste est toujours vide...
Non.. franchement, utilise un AsyncTask pour ce que tu veux faire....
L'UI ne peut être modifiée depuis un thread autre que le thread UI.
Le thread UI n'a pas le droit de faire des opération longue.
La classe qui relie les deux: c'est AsyncTask (ou les Loader mais bon...).
(template de code, il ne compile pas, c'est juste pour montrer !)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 class MyActivity extends Activity { public void onCreate() { super.onCreate(); ... new AsyncTask<String,ArrayList<ArrayList<String>,Void>() { @Override public ArrayList<ArrayList<String>> doInBackground() { ... le code de ton "thread", avec un return de l'array-list finale à la fin... PAS D'UTILISATION DE VARIABLE DE MY-ACTIVITY } @Override public void onPostExecute(ArrayList<ArrayList<String>>) { ... modification de l'UI... car ici, on est dans le bon thread UI ! } }.execute(); } }
D'accord, j'ai suivi tes conseils et j'ai utilisé un AsyncTask.
Mais bien sûr ça ne marche pas..
Je ne rentre même pas dans mon AsyncTask
Voici mon code:
Code:
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 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); new MyAsyncTask().execute(); } private class MyAsyncTask extends AsyncTask<Void, Void, ArrayList<ArrayList>> { protected ArrayList<ArrayList> doInBackground(Void... params) { try { URL url = new URL("http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Log.d("TAG","Been here... done that..."); InputStream in = url.openStream() ; Log.d("TAG","Been here... done that..."); Document doc = db.parse(new InputSource(in)); Log.d("TAG","Been here... done that..."); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("website"); // NodeList nodeList = doc.getElementsByTagName("item"); for (int i = 0; i < nodeList.getLength(); i++) { ArrayList<String> aTableauTmp = new ArrayList<String>(); aTableauTmp = new ArrayList<String>(); Node node = nodeList.item(i); Element fstElmnt = (Element) node; aTableauTmp.add(fstElmnt.getAttribute("category")); aTableRetour.add(aTableauTmp); } } catch (Exception e) { Log.e("TAG","XML parsing errror",e); } return aTableRetour; }
Avec ce code, tu rentres forcément dans l'AsyncTask... avec des Log appropriés...
Oui effectivement après avoir inséré un toast dans ma méthode onPostExecute(Void result), j'ai pu constater que je rentrais bien dans mon AsyncTask.
C'est bon je suis enfin arrivé à remplir mon arrayList avec les données de mon XML.
Voici mon code:
Je pense que maintenant c'est bon et qu'il n'y a plus de fautes.Code:
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 public class MainActivity extends Activity { ArrayList<ArrayList> aTableRetour = new ArrayList<ArrayList>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new MyAsyncTask().execute(); } private class MyAsyncTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { try { URL url = new URL("http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Log.d("TAG","Been here... done that..."); InputStream in = url.openStream() ; Log.d("TAG","Been here... done that..."); Document doc = db.parse(new InputSource(in)); Log.d("TAG","Been here... done that..."); doc.getDocumentElement().normalize(); NodeList nodeList = doc.getElementsByTagName("website"); for (int i = 0; i < nodeList.getLength(); i++) { ArrayList<String> aTableauTmp = new ArrayList<String>(); aTableauTmp = new ArrayList<String>(); Node node = nodeList.item(i); Element fstElmnt = (Element) node; aTableauTmp.add(fstElmnt.getAttribute("category")); aTableRetour.add(aTableauTmp); } } catch (Exception e) { Log.e("TAG","XML parsing errror",e); } return null; } protected void onProgressUpdate( Void... progress) { } protected void onPostExecute(Void result) { for (ArrayList v : aTableRetour) { Toast.makeText(MainActivity.this, v.get(0).toString(), 0).show(); } }
Merci beaucoup ;).