Stringa parsata in textView

di il
13 risposte

Stringa parsata in textView

Salve amici sto avendo dei problemi nella realizzazione di un'app e volevo chiedervi qualche consiglio. Praticamente io vado a fare il parsing da un sito utilizzando la libreria jsoup. Premesso che il parsing l'ho provato in eclipse creando un progetto java, ed è funzionante, ho deciso di implementarlo nel progetto android utilizzando sempre eclipse; mi ricavo da questo parsing una stringa e infine passo questa stringa alla mia textview. Il tutto è stato fatto utilizzando un thread.
Il problema è che l'applicazione si avvia, non da errori, sembra connettersi a internet e nella console mi appaiono questi messaggi:

07-18 01:56:14.791: D/dalvikvm(360): GC_FOR_MALLOC freed 1838 objects / 362160 bytes in 43ms
07-18 01:56:15.232: D/dalvikvm(360): GC_FOR_MALLOC freed 3509 objects / 197152 bytes in 60ms
07-18 01:56:15.621: D/dalvikvm(360): GC_FOR_MALLOC freed 8706 objects / 365256 bytes in 51ms
07-18 01:57:11.773: D/dalvikvm(360): GC_FOR_MALLOC freed 5655 objects / 287024 bytes in 322ms
07-18 01:57:11.773: I/dalvikvm-heap(360): Grow heap (frag case) to 4.241MB for 131088-byte allocation
07-18 01:57:12.022: D/dalvikvm(360): GC_FOR_MALLOC freed 145 objects / 6944 bytes in 247ms


ma nell'attività in cui midovrebbe comparire la stringa, continua ad essere vuota. Potete darmi una mano a capire quale sia il problema perfavore? grazie mille

il codice è il seguente:
public class MainActivity extends Activity {

        String url="[url=http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=";]Gazzetta di Benevento[/url]
        ProgressDialog mProgressDialog;

        
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Execute Title AsyncTask
        new Mese().execute();
      
        
    }
    
    
    // nome del mese Asyntask
    private class Mese extends AsyncTask<Void, Void, Void>
    {

        String mese;
        Document doc;
                
        @Override
        protected void onPreExecute() {
          super.onPreExecute();
          mProgressDialog = new ProgressDialog(MainActivity.this);
          mProgressDialog.setTitle("Recovery data");
          mProgressDialog.setMessage("Loading...");
          mProgressDialog.setIndeterminate(false);
          mProgressDialog.show();
        }
        
                @Override
                protected Void doInBackground(Void... params) {
                        // TODO Auto-generated method stub
                        
                        try 
                        {
                                //connettiti al sito
                                // sfrutta la codifica ISO-8859-1 in modo tale da poter fare l'encode in maniera corretta.
                                doc = Jsoup.parse(new java.net.URL(url).openStream(), "ISO-8859-1", url);
                        
                                Element tbody = doc.select("table[width=809]").first().child(0);
                         

                                   // mi prendo tutti i figli di tbody
                                   Elements rows = tbody.children();
                                  
                                   // cancello le prime 4 righe corrispondenti a <tr>
                                   Element riga = rows.get(4);
                                  
                                   // cambiando i valori di get, riesco a prendermi tutti i titoli
                                   String mese = riga.select("div span strong").get(0).text();
                                   
                        }
                        
                        catch (Exception e) 
                        {
               // gestione dell'eccezione
               // ad esempio mostrare messaggio di errore o altro (qui nel logcat)
               Log.e("ESEMPIO", "ERRORE NEL PARSING");
                        }

                        
                        return null;
                }
                
            @Override
            protected void onPostExecute(Void result) {
               // assegno all'oggetto textview il suo riferimento
               TextView tvMese = (TextView)findViewById(R.id.mese);
               tvMese.setText(mese);
               mProgressDialog.dismiss();
            }
          }
        
}
    
        
        
     

13 Risposte

  • Re: Stringa parsata in textView

    Ciao, quelli che vedi nel logcat non sono errori ma messaggi "informativi" che il sistema operativo invia nel momento in cui viene liberata della memoria per fare spazio a nuovi oggetti.
    Il vero problema del tuo codice sta nella variabile "mese". All'interno dell'AsyncTask c'è una variabile d'istanza, che viene "offuscata" dalla variabile locale al metodo "doInBackground". Come risultato finale la variabile d'istanza rimane sempre vuota, e quando vai a riempire la TextView non ti compare la stringa desiderata.

    Per passare dei risultati dal "doInBackground" al "onPostExecute", inoltre, è opportuno sfruttare il supporto nativo della classe stessa. Infatti la classe
    AsyncTask<Params, Progress, Result>
    prevede 3 tipi generici (in questo caso Params, Progress e Result), in cui il terzo è il tipo di dato che il metodo "doInBackground" passa come risultato al "onPostExecute".
    In parole più semplici potresti fare una cosa del tipo:
    
    // nome del mese Asyntask
    private class Mese extends AsyncTask<Void, Void, String> {
    			
    	@Override
    	protected void onPreExecute() {
    	  super.onPreExecute();
    	  // Fai le operazioni che ti servono
    	}
    	
    	@Override
    	protected String doInBackground(Void... params) {			
    		try {
    			...
    			
    			String mese = riga.select("div span strong").get(0).text();
    			return mese;
    		}
    			
    		catch (Exception e) {
    			...
    		}
    		return null;
    	}
    			
    	@Override
    	protected void onPostExecute(String result) {
    		// assegno all'oggetto textview il suo riferimento
    		TextView tvMese = (TextView)findViewById(R.id.mese);
    		tvMese.setText(result);
    		mProgressDialog.dismiss();
    	}
    }
    
  • Re: Stringa parsata in textView

    Ciao Della grazie per il sostegno che mi dai sempre, ho fatto la correzione che mi hai suggerito, ma continua a non visualizzarmi la stringa
  • Re: Stringa parsata in textView

    Hai provato a vedere se la variabile mese ha il valore che ti aspetti?


    Sent from my iPhone using Tapatalk
  • Re: Stringa parsata in textView

    Ho fatto come mi hai suggerito tu e la variabile contiene il valore corretto
    Ti posto l'immagine
    Allegati:
    10182_6501897ef3f06b8e71d3be3285bdfa66.tiff
    10182_6501897ef3f06b8e71d3be3285bdfa66.tiff
  • Re: Stringa parsata in textView

    Ok..potresti postare l'intera classe AsyncTask così ci do 1 occhiata?


    Sent from my iPhone using Tapatalk
  • Re: Stringa parsata in textView

    Della ha scritto:


    Ok..potresti postare l'intera classe AsyncTask così ci do 1 occhiata?


    Sent from my iPhone using Tapatalk
    package com.example.turni.farmacie;
    
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.util.Log;
    import android.view.Menu;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	String url="http://www.gazzettabenevento.it/Sito2009/dettagliocomunicato.php?Id=26226&vcercaCom=";
    	ProgressDialog mProgressDialog;
    
    	
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            // Execute Title AsyncTask
            new Mese().execute();
          
            
        }
        
        
        // nome del mese Asyntask
        private class Mese extends AsyncTask<Void, Void, String>
        {
    
        	String mese;
        	Document doc;
      		
        	@Override
            protected void onPreExecute() {
              super.onPreExecute();
              mProgressDialog = new ProgressDialog(MainActivity.this);
              mProgressDialog.setTitle("Recovery data");
              mProgressDialog.setMessage("Loading...");
              mProgressDialog.setIndeterminate(false);
              mProgressDialog.show();
            }
        	
    		@Override
    		protected String doInBackground(Void... params) {
    			// TODO Auto-generated method stub
    			
    			try 
    			{
    				//connettiti al sito
    				// sfrutta la codifica ISO-8859-1 in modo tale da poter fare l'encode in maniera corretta.
    				doc = Jsoup.parse(new java.net.URL(url).openStream(), "ISO-8859-1", url);
    			
    				Element tbody = doc.select("table[width=809]").first().child(0);
    		         
    
    				   // mi prendo tutti i figli di tbody
    				   Elements rows = tbody.children();
    				  
    				   // cancello le prime 4 righe corrispondenti a <tr>
    				   Element riga = rows.get(4);
    				  
    				   // cambiando i valori di get, riesco a prendermi tutti i titoli
    				   String mese = riga.select("div span strong").get(0).text();
    				   Log.d("Valore mese=", mese);
    				   return mese;
    			}
    			
    			catch (Exception e) 
    			{
                   // gestione dell'eccezione
                   // ad esempio mostrare messaggio di errore o altro (qui nel logcat)
    				Log.e("MYAPP", "exception: " + e.toString());	// il metodo e.toString()
    																// indica l'errore che ha 
    																// generato l'eccezione
    				
    			}
    
    			
    			return null;
    		}
    		
    	    @Override
    	    protected void onPostExecute(String result) {
    	       // assegno all'oggetto textview il suo riferimento
    	       TextView tvMese = (TextView)findViewById(R.id.mese);
    	       tvMese.setText(mese);
    	       mProgressDialog.dismiss();
    	    }
    	  }
        	
    }
        
            
            
          
  • Re: Stringa parsata in textView

    Ok, semplicemente la variabile d'istanza "mese" a questo punto diventa inutile. Infatti il metodo "doInBackground" permette di passare un valore a "onPostExecute" attraverso il return.
    In pratica così dovrebbe andare:
    
    private class Mese extends AsyncTask<Void, Void, String>
    {
    	
       @Override
    	protected void onPreExecute() {
    	  super.onPreExecute();
    	  mProgressDialog = new ProgressDialog(MainActivity.this);
    	  mProgressDialog.setTitle("Recovery data");
    	  mProgressDialog.setMessage("Loading...");
    	  mProgressDialog.setIndeterminate(false);
    	  mProgressDialog.show();
    	}
       
      @Override
      protected String doInBackground(Void... params) {
    	 // TODO Auto-generated method stub
    	 
    	 try 
    	 {
    		//connettiti al sito
    		// sfrutta la codifica ISO-8859-1 in modo tale da poter fare l'encode in maniera corretta.
    		Document doc = Jsoup.parse(new java.net.URL(url).openStream(), "ISO-8859-1", url);
    	 
    		Element tbody = doc.select("table[width=809]").first().child(0);
    		   
    
    		   // mi prendo tutti i figli di tbody
    		   Elements rows = tbody.children();
    		  
    		   // cancello le prime 4 righe corrispondenti a <tr>
    		   Element riga = rows.get(4);
    		  
    		   // cambiando i valori di get, riesco a prendermi tutti i titoli
    		   String mese = riga.select("div span strong").get(0).text();
    		   Log.d("Valore mese=", mese);
    		   return mese;
    	 }
    	 
    	 catch (Exception e) 
    	 {
    		   // gestione dell'eccezione
    		   // ad esempio mostrare messaggio di errore o altro (qui nel logcat)
    		Log.e("MYAPP", "exception: " + e.toString());   // il metodo e.toString()
    											// indica l'errore che ha 
    											// generato l'eccezione
    		
    	 }
    
    	 
    	 return null;
      }
      
       @Override
       protected void onPostExecute(String result) {
    	  // assegno all'oggetto textview il suo riferimento
    	  TextView tvMese = (TextView)findViewById(R.id.mese);
    	  tvMese.setText(result);
    	  mProgressDialog.dismiss();
       }
     }
    
  • Re: Stringa parsata in textView

    Grandeeee!!!!! funziona adesso ...comunque ho capito l'errore che commettevo....grazie mille sei stato davvero grande !! Grazie mille per l'aiuto che mi dai sempre!
  • Re: Stringa parsata in textView

    Di niente, l'importante è capire gli errori


    Sent from my iPhone using Tapatalk
  • Re: Stringa parsata in textView

    Si si ho capito l'errore... banale ma senza il tuo prezioso aiuto avrei perso molto tempo a trovarlo.
  • Re: Stringa parsata in textView

    Della volevo chiederti una cosa. Ho notato una cosa strana nella mia app e volevo chiederti un consiglio. Ho un'activtity in cui ho una serie di bottoni ed ogni bottone ha del testo corrispondente che viene prelevato da internet con il metodo dell'asynctask. funziona tutto però quando si avvia la suddetta activity il testo corrispondente si visualizza in modo successivo e tra un bottone e l'altro passa un po di tempo(stiamo parlando di frazioni di secondo che sia chiaro), però visivamente non è molto bello. Ti volevo chiedere è normale questa cosa oppure esiste un metodo per velocizzare questo processo?grazie
  • Re: Stringa parsata in textView

    Beh se il testo viene preso da internet è normale che richieda del tempo..fra l'altro cosa succede se, ad esempio, viene a mancare la connessione, oppure se questa è estremamente lenta? Hai tenuto in considerazione questi casi particolari?
  • Re: Stringa parsata in textView

    Devo aggiungere una nuova activity che in assenza di connessione avverta l'utente di connettere il dispositivo in caso di assenza di connessione. Però voglio finire prima alcuni aspetti e poi implemento anche questo. Ora sto avendo un'altro problema a dire il vero, causato dal sito che non è molto stabile . Infatti ho chiesto il vostro aiuto sul sito però su un'altro topic.
Devi accedere o registrarti per scrivere nel forum
13 risposte