Autore Topic: Ciclo for all'interno di un Asynstask  (Letto 1679 volte)

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Ciclo for all'interno di un Asynstask
« il: 11 Marzo 2012, 15:10:46 CET »
0
Ciao a tutti, devo effettuare un parsing di una tabella che ha 40 elementi definiti tutti con un ID incrementale.
Tipo elementoID_1 , elementoID_2 ,elementoID_3 etc...

Questo è il codice che ho scritto:

Codice (Java): [Seleziona]
//AsyncTask
        public class HttpGetTask extends AsyncTask<String,String,String>  {
           @Override
           public String doInBackground(String... params) {

                   try {
                   doc = Jsoup.parse(new URL("http://mia URL), 5000);
     
         
                   for (int i=0; i<40 ;i++){
                           ParsingElemento = doc.getElementById("
elementoID_"+i+");         //  ParsingElemento è di Tipo Element nella libreria Jsoup
                         
                            // QUI MI MANCA QUALCOSA PER MEMORIZZARE il risultato di ogni ID (un array di tipo Element) ?
                   }
                 
                     
                   }
                   catch (MalformedURLException e) {
                   pd.dismiss();
                   e.printStackTrace();
           }
                   catch (IOException e) {
                   pd.dismiss();
                   e.printStackTrace();
           }
                        return result;                              
   }      
           
                protected void onProgressUpdate(String... values) {
               pd.setMessage("Dati ricevuti");
       
            }

            protected void onPostExecute(String result) {
               pd.dismiss();
             Log.i("Risultato", ParsingElemento.text());  

                 
            }

Nel doInBackground riesco a fare scorrere tutto il ciclo for , ma mi manca qualcosa (tipo un Array ma non so come implementarlo) per memorizzare gli elementi man mano che il ciclo viene eseguito.

Infatti nell' onPostExecute riesco ad ottenere solol'ultimo risultato (il 40esimo in questo caso) scrivendo: ParsingElemento.text()

Idee su come possa scrivere quel pezzo di codice che memorizzi i dati del for??

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Ciclo for all'interno di un Asynstask
« Risposta #1 il: 11 Marzo 2012, 15:31:28 CET »
0
Perché non un array?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Ciclo for all'interno di un Asynstask
« Risposta #2 il: 11 Marzo 2012, 16:47:30 CET »
0
Nel doInBackground riesco a fare scorrere tutto il ciclo for , ma mi manca qualcosa (tipo un Array ma non so come implementarlo) per memorizzare gli elementi man mano che il ciclo viene eseguito.

Offline Kruger

  • Nuovo arrivato
  • *
  • Post: 10
  • Movimento "Mela-Marcia"
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Ubuntu 11.10, Windows 7
Re:Ciclo for all'interno di un Asynstask
« Risposta #3 il: 11 Marzo 2012, 17:00:30 CET »
0
Un ArrayList<GenericType> statico? potrebbe andare? Al posto di GenericType metti l'elemento in questione


Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Ciclo for all'interno di un Asynstask
« Risposta #4 il: 11 Marzo 2012, 17:29:49 CET »
0
Nel frattempo credo di essere vicino alla soluzione , ma sbaglio qualcosa nell' array .
Ho provato a fare così,
Dichiarato globalmente l'array
Codice (Java): [Seleziona]
Element [] ParsingData = null;
Poi nel doInBackground

Codice (Java): [Seleziona]
for (int i=0; i<40 ;i++){
        ParsingElemento = doc.getElementById("elementoID_"+i+");  
             ParsingData = new Element[] {ParsingElemento} ;

Il problema è poi nell' onPostExecute

Dovrei cercare di convertire tutto l'array in stringa per poterlo visualizzare in una textview
Ho fatto così:
 
Codice (Java): [Seleziona]
miatextview.setText(ParsingData[0].text());
miatextview.setText(ParsingData[1].text());
miatextview.setText(ParsingData[2].text());
miatextview.setText(ParsingData[3].text());

Da errore.
L'errore che mi da è legato al fatto che nell'array non vengono comunque memorizzati i 40 ID, ma mi resta sempre e solo l'ultimo valore.

Infatti se metto solo
Codice (Java): [Seleziona]
miatextview.setText(ParsingData[0].text()); funziona, ma mi restituisce solo l'ultimo valore, il 40esimo, esattamente come prima

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Ciclo for all'interno di un Asynstask
« Risposta #5 il: 11 Marzo 2012, 20:45:59 CET »
0
Nel ciclo for stai reinizializzando l'array ad ogni iterazione. É ovvio che ti visualizza solo l'ultimo valore, perché nell'ultima iterazione ricrei un array che contiene solo quel valore.
Quello che devi fare é inizializzare l'array prima del ciclo
Codice (Java): [Seleziona]
ParsingData = new Element[40] e poi assegnare a ogni elemento il corrispondente
Codice (Java): [Seleziona]
ParsingData[i] = doc.get.....
« Ultima modifica: 11 Marzo 2012, 20:47:48 CET da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Ciclo for all'interno di un Asynstask
« Risposta #6 il: 11 Marzo 2012, 21:01:09 CET »
0
Si si.. avevo gia risolto :)
non mi quadrava appunto quello che hai descritto tu.

Ho risolto con un doppio for! :)

Mi complicavo la vita perchè dovevo fare 5 array.
Cmq  a chi interessasse...

Codice (Java): [Seleziona]
//Tutti gli Array element necessari per la lista
        Element [] Array1,Array2,Array3,Array4,Array5= new Element [40];

................

 for (int i=0, j=2 ; (i<40 && j<40) ; i++, j++) {

Array1[i] = doc.getElementById("elementoID_" + j + ");
Array2[i] = doc.getElementById("
elementoID_" + j + ");
Array3[i] = doc.getElementById("elementoID_" + j + ");
Array4[i] = doc.getElementById("
elementoID_" + j + ");
Array5[i] = doc.getElementById("elementoID_" + j + ");

Ora sto cercando il modo più pulito per scrivere tutta quella massa di dati in una lista o in una textview.

Il modo più rozzo e più immediato sarebbe questo:

Codice (Java): [Seleziona]
miaTextView.setText(    
                                        "Data 1 : "+Array1[0].text()     + "\n" +
                                        "Data 2 : "+Array2[0].text()     + "\n" +
                                        "Data 3 : "+Array3[0].text()     + "\n" +
                                        "Data 4 : "+Array4[0].text()     + "\n" +
                                        "Data 5 : "+Array5[0].text()     + "\n"+ "\n" +

                                        "Data 1 : "+Array1[1].text()     + "\n" +
                                        "Data 2 : "+Array2[1].text()     + "\n" +
                                        "Data 3 : "+Array3[1].text()     + "\n" +
                                        "Data 4 : "+Array4[1].text()     + "\n" +
                                        "Data 5 : "+Array5[1].text()     + "\n" );
// e così via

Sicuramente ci sarà un modo migliore per scrivere questa cosa..
Lo troverò! :)

Tipo un ciclo che mi conta 5 volte lo stesso numero  epoi va avanti.. o qualcosa del genere....


Nel frattempo se ci sono suggerimenti sono ben graditi!  :-P
« Ultima modifica: 11 Marzo 2012, 21:10:12 CET da dr4gone »

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Ciclo for all'interno di un Asynstask
« Risposta #7 il: 11 Marzo 2012, 21:56:45 CET »
0
Non ho ben capito perché crei 5 array uguali..
Postate il LogCat LogCat LogCat LogCat LogCat

Offline dr4gone

  • Utente junior
  • **
  • Post: 66
  • Respect: +1
    • Mostra profilo
Re:Ciclo for all'interno di un Asynstask
« Risposta #8 il: 11 Marzo 2012, 22:26:33 CET »
0
non sono uguali...
Mi sono spiegato male io...

 In realtà gli array sono 5, e ognuno di essi rappresenta una cosa diversa.

Ad esempio pensa ad una persona.

Faccio il parsing di una tabella che contiene tutti i dati (nome,cognome.età) di varie persone divise per ID..

Codice (Java): [Seleziona]
for (int i=0, j=2 ; (i<40 && j<40) ; i++, j++) {

Nome[i] = doc.getElementById("nomeID_" + j + ");
Cognome[i] = doc.getElementById("
cognomeID_" + j + ");
Età[i] = doc.getElementById("etàID_" + j + ");

E così via

In quel modo ottego un vettore per i nomi, uno per i cognomi etc

Poi in OnpostExecute,
devo ricomporre questi vettori in modo tale che il primo elemento di ogni i vettore:
Nome[0].text()
Cognome[0].text()
Età[0].text()
mi ritorni Nome Cognome e Età della prima persona in ordine..

Forse ora sono riuscito meglio a rendere l'esempio

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
R: Ciclo for all'interno di un Asynstask
« Risposta #9 il: 12 Marzo 2012, 07:13:44 CET »
+1
Beh allora usa una classe "Persona" con gli attributi che ti interessano. In questa classe andrai a definire anche un metodo toString() in cui creerai e restituirai la stringa con gli attributi per come la vuoi..
Postate il LogCat LogCat LogCat LogCat LogCat