Autore Topic: Salvare html di una pagina web come stringa  (Letto 2154 volte)

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Salvare html di una pagina web come stringa
« il: 22 Agosto 2012, 11:10:16 CEST »
0
Ciao a tutti! Sto cercando di fare in modo che la mia applicazione si connetta a internet e salvi come String il codice html della pagina desiderata. Ho fatto la Activity principale che richiama un AsyncTask per la connessione a internet, ma non funziona. Cosa sbaglio?

MainActivity

Codice (Java): [Seleziona]
package teo2490.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {
       
  private TextView textView1;
  private Button bottone1;
  private Button bottone2;
  private String res;
  private WebView wb;
 
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   
    //Setta gli oggetti di activity_main.xml
    setContentView(R.layout.activity_main);
   
    //Dichiarazione TextView e Pulsanti
    textView1 = (TextView) findViewById(R.id.testo1);
    textView1.setText("Testo modificato tramite codice 1");
   
    wb = (WebView) findViewById(R.id.myWebView);
   
    bottone1 = (Button) findViewById(R.id.bottone1);
    bottone2 = (Button) findViewById(R.id.bottone2);
   
    Void params = null;
        res = new DownloadFilesTask().doInBackground(params);
     
   
    //Listener per i pulsanti
    View.OnClickListener gestore = new View.OnClickListener() {
          public void onClick(View view) {
           
            switch(view.getId()){
                       
              case R.id.bottone1:
                textView1.setText(res);
                break;
                               
              case R.id.bottone2:
                  wb.loadData(res, "text/html", "UTF-8");
                break;
            }  
          }
        };
               
        bottone1.setOnClickListener(gestore);
        bottone2.setOnClickListener(gestore);
  }
}

AsyncTask:

Codice (Java): [Seleziona]
package teo2490.android;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import android.os.*;

public class DownloadFilesTask extends AsyncTask<Void, Void, String> {
        private String html;
        @Override
    protected String doInBackground(Void... params) {
          URL u = null;
                try {
                        u = new URL("[url=http://dailygospel.org/main.php?language=IT"]VANGELO DEL GIORNO[/url]);
                } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                          InputStream is = null;
                        try {
                                is = u.openStream();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        try {
                                html = convertStreamToString(is);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        return html;
    }

       
          private String convertStreamToString(InputStream is)
                  throws IOException {
              //
              // To convert the InputStream to String we use the
              // Reader.read(char[] buffer) method. We iterate until the
              // Reader return -1 which means there's no more data to
              // read. We use the StringWriter class to produce the string.
              //
              if (is != null) {
                  Writer writer = new StringWriter();

                  char[] buffer = new char[1024];
                  try {
                      Reader reader = new BufferedReader(
                              new InputStreamReader(is, "UTF-8"));
                      int n;
                      while ((n = reader.read(buffer)) != -1) {
                          writer.write(buffer, 0, n);
                      }
                  } finally {
                      is.close();
                  }
                  return writer.toString();
              } else {        
                  return "";
              }
          }
}

Logcat;


08-22 09:09:46.089: E/Trace(722): error opening trace file: No such file or directory (2)
08-22 09:09:46.719: D/AndroidRuntime(722): Shutting down VM
08-22 09:09:46.729: W/dalvikvm(722): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-22 09:09:46.769: E/AndroidRuntime(722): FATAL EXCEPTION: main
08-22 09:09:46.769: E/AndroidRuntime(722): java.lang.RuntimeException: Unable to start activity ComponentInfo{teo2490.android/teo2490.android.MainActivity}: android.os.NetworkOnMainThreadException
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.os.Looper.loop(Looper.java:137)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread.main(ActivityThread.java:4745)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.lang.reflect.Method.invokeNative(Native Method)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.lang.reflect.Method.invoke(Method.java:511)
08-22 09:09:46.769: E/AndroidRuntime(722):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-22 09:09:46.769: E/AndroidRuntime(722):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-22 09:09:46.769: E/AndroidRuntime(722):    at dalvik.system.NativeStart.main(Native Method)
08-22 09:09:46.769: E/AndroidRuntime(722): Caused by: android.os.NetworkOnMainThreadException
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
08-22 09:09:46.769: E/AndroidRuntime(722):    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
08-22 09:09:46.769: E/AndroidRuntime(722):    at java.net.URL.openStream(URL.java:462)
08-22 09:09:46.769: E/AndroidRuntime(722):    at teo2490.android.DownloadFilesTask.doInBackground(DownloadFilesTask.java:28)
08-22 09:09:46.769: E/AndroidRuntime(722):    at teo2490.android.MainActivity.onCreate(MainActivity.java:37)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.Activity.performCreate(Activity.java:5008)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-22 09:09:46.769: E/AndroidRuntime(722):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-22 09:09:46.769: E/AndroidRuntime(722):    ... 11 more


Grazie mille! :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Salvare html di una pagina web come stringa
« Risposta #1 il: 22 Agosto 2012, 11:19:35 CEST »
0
Il problema sostanziale è che, pur usando un AsyncTask, ti aspetti comunque il risultato dello scaricamento dentro la OnCreate (quando scrivi res = ). Questo blocca la OnCreate e genera l'errore.

Il concetto generale a cui pensare è questo: nella OnCreate avvii l'AsyncTask e te ne disinteressi facendo terminare la OnCreate, sarà poi l'AsyncTask ad avvisare ed agire quando ha finito.

Guarda questo tutorial, un po' vecchio ormai, ma comunque dovrebbe chiarire il senso:
[facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #2 il: 22 Agosto 2012, 11:44:18 CEST »
0
Credo di aver risolto, grazie mille! Adesso però da un nuovo errore riguardo a una qualche stringa, ma non riesco a capire perchè. sapresti aiutarmi per favore? Grazie mille! :-)

Codice (Java): [Seleziona]
package teo2490.android;

import java.util.concurrent.ExecutionException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {
       
  private TextView textView1;
  private Button bottone1;
  private Button bottone2;
  private String res = new String();
  private String r;
  private WebView wb;
 
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   
    //Setta gli oggetti di activity_main.xml
    setContentView(R.layout.activity_main);
   
    //Dichiarazione TextView e Pulsanti
    textView1 = (TextView) findViewById(R.id.testo1);
    textView1.setText("Testo modificato tramite codice 1");
   
    wb = (WebView) findViewById(R.id.myWebView);
   
    bottone1 = (Button) findViewById(R.id.bottone1);
    bottone2 = (Button) findViewById(R.id.bottone2);
   
    //----------------------------------------------------------------
    //Connessione e recupero html
    Void params = null;
    AsyncTask<Void, Void, String> at = new DownloadFilesTask().execute(params);
    try {
                res = at.get();
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
    //-----------------------------------------------------------------
   
    r = new String(extract(res));
   
    //Listener per i pulsanti
    View.OnClickListener gestore = new View.OnClickListener() {
          public void onClick(View view) {
           
            switch(view.getId()){
                       
              case R.id.bottone1:
                textView1.setText(r);
                break;
                               
              case R.id.bottone2:
                  wb.loadData(r, "text/html", "UTF-8");
                break;
            }  
          }
        };
               
        bottone1.setOnClickListener(gestore);
        bottone2.setOnClickListener(gestore);
  }
 
  public String extract(String res){
          String s1 = new String("Dal Vangelo");
          String s2 = new String("<br /><br /><br /><p style='text-align:right;font-size:10px;'>Traduzione liturgica della Bibbia");
          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
         
          return ris;
  }
}

08-22 09:43:49.801: E/Trace(1337): error opening trace file: No such file or directory (2)
08-22 09:43:51.269: D/dalvikvm(1337): GC_FOR_ALLOC freed 154K, 4% free 8201K/8455K, paused 50ms, total 50ms
08-22 09:43:51.289: D/AndroidRuntime(1337): Shutting down VM
08-22 09:43:51.289: W/dalvikvm(1337): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-22 09:43:51.309: E/AndroidRuntime(1337): FATAL EXCEPTION: main
08-22 09:43:51.309: E/AndroidRuntime(1337): java.lang.RuntimeException: Unable to start activity ComponentInfo{teo2490.android/teo2490.android.MainActivity}: java.lang.StringIndexOutOfBoundsException: length=45687; regionStart=42251; regionLength=-42252
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread.access$600(ActivityThread.java:130)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.os.Looper.loop(Looper.java:137)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread.main(ActivityThread.java:4745)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.reflect.Method.invokeNative(Native Method)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.reflect.Method.invoke(Method.java:511)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at dalvik.system.NativeStart.main(Native Method)
08-22 09:43:51.309: E/AndroidRuntime(1337): Caused by: java.lang.StringIndexOutOfBoundsException: length=45687; regionStart=42251; regionLength=-42252
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.String.startEndAndLength(String.java:593)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.String.substring(String.java:1474)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at teo2490.android.MainActivity.extract(MainActivity.java:81)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at teo2490.android.MainActivity.onCreate(MainActivity.java:55)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.Activity.performCreate(Activity.java:5008)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
08-22 09:43:51.309: E/AndroidRuntime(1337):    ... 11 more
08-22 09:44:06.080: I/Process(1337): Sending signal. PID: 1337 SIG: 9

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Salvare html di una pagina web come stringa
« Risposta #3 il: 22 Agosto 2012, 12:10:18 CEST »
0
Dal tuo codice mi sembra che tu non debba scaricare l'html (ad esempio per visualizzarlo), ma solamente analizzarlo e prenderne alcune parti che ti interessano.

Se non ho frainteso, e quello che penso è giusto, ti consiglio di usare un parser html già pronto. Ti risparmia la seccatura di analizzarti per conto tuo la pagina web, e (a mio parere) evita di reinventare la ruota.


Io uso jsoup, perchè è quello con cui mi sono trovato meglio, ma ne esistono altri di equivalenti (google è tuo amico)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Salvare html di una pagina web come stringa
« Risposta #4 il: 22 Agosto 2012, 12:14:00 CEST »
0
Ti mostro anche come individuare da solo le cause dal LogCat, visto che veramente viene evidenziato facilmente.  ;-)

Citazione
08-22 09:43:51.309: E/AndroidRuntime(1337): Caused by: java.lang.StringIndexOutOfBoundsException: length=45687; regionStart=42251; regionLength=-42252
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.String.startEndAndLength(String.java:593)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at java.lang.String.substring(String.java:1474)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at teo2490.android.MainActivity.extract(MainActivity.java:81)
08-22 09:43:51.309: E/AndroidRuntime(1337):    at teo2490.android.MainActivity.onCreate(MainActivity.java:55)

Cerca la riga dove ti indica la causa generale, Caused by: java.lang.StringIndexOutOfBoundsException, che ti dice che stai manipolando una stringa fornendo indici non validi.

Poi cerca una o più righe dove trovi il file java della tua activity e il numero di riga, MainActivity.java:81, che ti dice dove di preciso si è generato l'errore.

La causa dovrebbe essere abbastanza palese: tu assumi nella funzione extract che gli indici siano sempre validi, mentre ciò non è detto che sia vero. O quanto meno devi fare un minimo di error management, cioè prima valida i due indexOf, se sono numericamente validi allora procedi, altrimenti genera un messaggio di errore per la tua app e per il logcat.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #5 il: 22 Agosto 2012, 13:11:11 CEST »
0
Grazie mille! :-)

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #6 il: 23 Agosto 2012, 09:46:02 CEST »
0
Buongiorno! Avrei un problemino con la mia applizazione che non riesco a risolvere. il funzionamento è abbastanza semplice: 2 bottoni, clicco uno e viene visualizzata una parte di una pagina html, clicco l'altro e DOVREBBE fare la stessa cosa con un'altra pagina. Questo non succede, ma nel logcat non escono errori, ma un messaggio che non so cosa indichi. Qualcuno può darmi delucidazioni per favore? Grazie! :-)

Codice (Java): [Seleziona]
package teo2490.android;

import java.util.concurrent.ExecutionException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {
       
  private TextView textView1;
  private Button bottone1;
  private Button bottone2;
  private String res = new String();
  private String res1 = new String();
  private String r = new String();
  private String r1 = new String();
  private WebView wb;
  private WebView wb1;
 
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   
    //Setta gli oggetti di activity_main.xml
    setContentView(R.layout.activity_main);
   
    //Dichiarazione TextView e Pulsanti
    textView1 = (TextView) findViewById(R.id.testo1);
    textView1.setText("Testo modificato tramite codice 1");
   
    wb = (WebView) findViewById(R.id.myWebView);
    wb1 = (WebView) findViewById(R.id.myWebView1);
   
    bottone1 = (Button) findViewById(R.id.bottone1);
    bottone2 = (Button) findViewById(R.id.bottone2);
   
    //----------------------------------------------------------------
    //Connessione e recupero html
    Void params = null;
    AsyncTask<Void, Void, String> at = new DownloadFilesTask().execute(params);
    try {
                res = at.get();
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
    //-----------------------------------------------------------------
   
    r = extract(res);
   
   
    //----------------------------------------------------------------
    //Connessione e recupero html
    Void params1 = null;
    AsyncTask<Void, Void, String> at1 = new DownloadFilesTaskl().execute(params1);
    try {
                res1 = at1.get();
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ExecutionException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
    //-----------------------------------------------------------------
   
    r1 = extract1(res1);
   
    //Listener per i pulsanti
    View.OnClickListener gestore = new View.OnClickListener() {
          public void onClick(View view) {
           
            switch(view.getId()){
                       
              case R.id.bottone1:
                //textView1.setText(r);
                  wb1.loadData(r1, "text/html", "UTF-8");
                break;
                               
              case R.id.bottone2:
                  wb.loadData(r, "text/html", "UTF-8");
                break;
               
            }  
          }
        };
               
        bottone1.setOnClickListener(gestore);
        bottone2.setOnClickListener(gestore);
  }
 
  public String extract(String res){
          String s1 = new String("Dal Vangelo");
          String s2 = new String("Traduzione liturgica della Bibbia");
          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
         
          return ris;
  }
 
  public String extract1(String res){
          String s1 = new String("<span style=\"color: red\">Invitatorio");
          String s2 = new String("<div class=\"firmaint\">");
          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
         
          return ris;
  }
}

Codice (Java): [Seleziona]
package teo2490.android;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import android.os.*;

public class DownloadFilesTaskl extends AsyncTask<Void, Void, String> {
        private String html;
        @Override
    protected String doInBackground(Void... params) {
          URL u = null;
                try {
                        u = new URL("http://www.chiesacattolica.it/pls/cci_new_v3/v3_s2ew_consultazione.mostra_pagina?id_pagina=30446");
                } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                          InputStream is = null;
                        try {
                                is = u.openStream();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        try {
                                html = convertStreamToString(is);
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        return html;
    }

       
          private String convertStreamToString(InputStream is)
                  throws IOException {
              //
              // To convert the InputStream to String we use the
              // Reader.read(char[] buffer) method. We iterate until the
              // Reader return -1 which means there's no more data to
              // read. We use the StringWriter class to produce the string.
              //
              if (is != null) {
                  Writer writer = new StringWriter();

                  char[] buffer = new char[1024];
                  try {
                      Reader reader = new BufferedReader(
                              new InputStreamReader(is, "UTF-8"));
                      int n;
                      while ((n = reader.read(buffer)) != -1) {
                          writer.write(buffer, 0, n);
                      }
                  } finally {
                      is.close();
                  }
                  return writer.toString();
              } else {        
                  return "";
              }
          }
}


08-23 07:45:30.435: D/dalvikvm(619): GC_FOR_ALLOC freed 187K, 3% free 8209K/8455K, paused 48ms, total 49ms
08-23 07:45:31.655: D/dalvikvm(619): GC_CONCURRENT freed 316K, 6% free 8333K/8775K, paused 99ms+99ms, total 229ms
08-23 07:45:31.966: I/Choreographer(619): Skipped 54 frames!  The application may be doing too much work on its main thread.
08-23 07:45:31.986: D/gralloc_goldfish(619): Emulator without GPU emulation detected.
08-23 07:45:32.275: I/Choreographer(619): Skipped 43 frames!  The application may be doing too much work on its main thread.
08-23 07:45:36.925: D/dalvikvm(619): GC_CONCURRENT freed 286K, 5% free 8463K/8903K, paused 96ms+7ms, total 129ms
08-23 07:45:36.925: D/dalvikvm(619): WAIT_FOR_CONCURRENT_GC blocked 33ms
08-23 07:45:37.836: D/dalvikvm(619): GC_FOR_ALLOC freed 394K, 7% free 8411K/9031K, paused 32ms, total 32ms

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Salvare html di una pagina web come stringa
« Risposta #7 il: 23 Agosto 2012, 09:58:00 CEST »
0
Premetto che stai usando AyncTask nel modo sbagliato, perchè lo usi in modo bloccante nella onCreate e non come sarebbe richiesto (cioè avviandolo e lasciando a lui il compito di ricevere e gestire la risposta). Un esempio (vecchio ma sempre valido) su come impostare il tutto è qua [facile] HttpBookSearch: AsyncTask, HttpClient, XML parsing, ProgressDialog - Android Developers Italia (ti consiglio di pensarci da subito perchè tanto prima o poi dovrai correggere quella parte).

Tra l'altro ti avvisa pure il logcat:
Citazione
08-23 07:45:31.966: I/Choreographer(619): Skipped 54 frames! The application may be doing too much work on its main thread.

Comunque, il malfunzionamento che descrivi è un altro. Devi fare il debug intermedio. Per esempio prova a caricare direttamente la stringa senza passarla da extract, oppure prova a salvare su file di testo nella sd la pagina caricata, oppure metti un po' di Log.d() intermedi per vedere dove l'esecuzione deraglia dal binario che ti aspetti.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #8 il: 23 Agosto 2012, 10:09:58 CEST »
0
Grazie della risposta Bradipao, ma non capisco: Perchè uso gli Async nel modo sbagliato? Come dovrei fare? Grazie! :-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Salvare html di una pagina web come stringa
« Risposta #9 il: 23 Agosto 2012, 10:12:22 CEST »
0
Grazie della risposta Bradipao, ma non capisco: Perchè uso gli Async nel modo sbagliato? Come dovrei fare? Grazie! :-)

E' tutto spiegato nel tutorial che ti ho linkato ed aggiungo anche il training dal sito ufficiale:
Connecting to the Network | Android Developers
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #10 il: 23 Agosto 2012, 10:13:43 CEST »
0
L'ho letto, ma non capisco. Sbaglio a chiamarlo nella MainActivity o è sbagliata la struttura dell'AsyncTask?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Salvare html di una pagina web come stringa
« Risposta #11 il: 23 Agosto 2012, 10:28:43 CEST »
0
L'ho letto, ma non capisco. Sbaglio a chiamarlo nella MainActivity o è sbagliata la struttura dell'AsyncTask?

Scrivendo questo non usi l'AsyncTask, ma solo la sua funzione.

Codice (Java): [Seleziona]
res = new DownloadFilesTask().doInBackground(params);
Se vedi gli esempio che ti ho indicato, loro ne avviano l'esecuzione e poi sarà la postexeceute a fornire i risultati.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #12 il: 23 Agosto 2012, 10:35:36 CEST »
0
Quindi così sarebbe corretto?

Codice (Java): [Seleziona]
package teo2490.android;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {
       
  private TextView textView1;
  private Button bottone1;
  private Button bottone2;
  private String res1 = new String();
  public WebView wb;
  private WebView wb1;
 
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   
    //Setta gli oggetti di activity_main.xml
    setContentView(R.layout.activity_main);
   
    //Dichiarazione TextView e Pulsanti
    textView1 = (TextView) findViewById(R.id.testo1);
    textView1.setText("Testo modificato tramite codice 1");
   
    wb = (WebView) findViewById(R.id.myWebView);
    wb1 = (WebView) findViewById(R.id.myWebView1);
   
    bottone1 = (Button) findViewById(R.id.bottone1);
    bottone2 = (Button) findViewById(R.id.bottone2);
   
    //Listener per i pulsanti
    View.OnClickListener gestore = new View.OnClickListener() {
          public void onClick(View view) {
           
            switch(view.getId()){
                       
              case R.id.bottone1:
                //textView1.setText(r);
                  wb1.loadData(res1, "text/html", "UTF-8");
                break;
                               
              case R.id.bottone2:
                  //Connessione e recupero html
                    Void params = null;
                    AsyncTask<Void, Void, String> at = new DownloadFilesTask();
                    at.execute(params);
                break;
               
            }  
          }
        };
               
        bottone1.setOnClickListener(gestore);
        bottone2.setOnClickListener(gestore);
  }
 
  private class DownloadFilesTask extends AsyncTask<Void, Void, String> {
                private String html;
                @Override
            protected String doInBackground(Void... params) {
                  URL u = null;
                        try {
                                u = new URL("[url=http://dailygospel.org/main.php?language=IT"]VANGELO DEL GIORNO[/url]);
                        } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                                  InputStream is = null;
                                try {
                                        is = u.openStream();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                try {
                                        html = convertStreamToString(is);
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                               
                                String r = new String(extract(html));
                                return r;
            }
               
                  @Override
              protected void onPostExecute(String r) {

                 // aggiorno i campi
                 wb.loadData(r, "text/html", "UTF-8");

              }
                 
           
                  public String extract(String res){
                          String s1 = new String("Dal Vangelo");
                          String s2 = new String("Traduzione liturgica della Bibbia");
                          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
                         
                          return ris;
                  }
               
                  private String convertStreamToString(InputStream is)
                          throws IOException {
                      //
                      // To convert the InputStream to String we use the
                      // Reader.read(char[] buffer) method. We iterate until the
                      // Reader return -1 which means there's no more data to
                      // read. We use the StringWriter class to produce the string.
                      //
                      if (is != null) {
                          Writer writer = new StringWriter();

                          char[] buffer = new char[1024];
                          try {
                              Reader reader = new BufferedReader(
                                      new InputStreamReader(is, "UTF-8"));
                              int n;
                              while ((n = reader.read(buffer)) != -1) {
                                  writer.write(buffer, 0, n);
                              }
                          } finally {
                              is.close();
                          }
                          return writer.toString();
                      } else {        
                          return "";
                      }
                  }
        }

}

Offline teo2490

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
Re:Salvare html di una pagina web come stringa
« Risposta #13 il: 23 Agosto 2012, 11:48:12 CEST »
0
Avrei inoltre un altro dubbio: se uso due AsyncTask UGUALI ma che puntano a inidrizzi web diversi, com'è possibile che uno vada (DownloadFilesTask), mentre l'altro crei problemi di memoria (DownloadFilesTaskSanto)?

Codice (Java): [Seleziona]
package teo2490.android;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Button;

public class MainActivity extends Activity {
       
  private TextView textView1;
  private Button bottone1;
  private Button bottone2;
  public WebView wb;
  private WebView wb1;
 
 
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   
    //Setta gli oggetti di activity_main.xml
    setContentView(R.layout.activity_main);
   
    //Dichiarazione TextView e Pulsanti
    textView1 = (TextView) findViewById(R.id.testo1);
    textView1.setText("Testo modificato tramite codice 1");
   
    wb = (WebView) findViewById(R.id.myWebView);
    wb1 = (WebView) findViewById(R.id.myWebView1);
   
    bottone1 = (Button) findViewById(R.id.bottone1);
    bottone2 = (Button) findViewById(R.id.bottone2);
   
    //Listener per i pulsanti
    View.OnClickListener gestore = new View.OnClickListener() {
          public void onClick(View view) {
           
            switch(view.getId()){
                       
              case R.id.bottone1:
                //textView1.setText(r);
                //Connessione e recupero html
                    Void params1 = null;
                    AsyncTask<Void, Void, String> at1 = new DownloadFilesTaskSanto();
                    at1.execute(params1);
                break;
                               
              case R.id.bottone2:
                  //Connessione e recupero html
                    Void params = null;
                    AsyncTask<Void, Void, String> at = new DownloadFilesTask();
                    at.execute(params);
                break;
               
            }  
          }
        };
               
        bottone1.setOnClickListener(gestore);
        bottone2.setOnClickListener(gestore);
  }
 
  private class DownloadFilesTask extends AsyncTask<Void, Void, String> {
                private String html;
                @Override
            protected String doInBackground(Void... params) {
                  URL u = null;
                        try {
                                u = new URL("[url=http://dailygospel.org/main.php?language=IT"]VANGELO DEL GIORNO[/url]);
                        } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                                  InputStream is = null;
                                try {
                                        is = u.openStream();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                try {
                                        html = convertStreamToString(is);
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                               
                                String r = new String(extract(html));
                                return r;
            }
               
                  @Override
              protected void onPostExecute(String r) {

                 // aggiorno i campi
                 wb.loadData(r, "text/html", "UTF-8");

              }
                 
           
                  public String extract(String res){
                          String s1 = new String("Dal Vangelo");
                          String s2 = new String("Traduzione liturgica della Bibbia");
                          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
                         
                          return ris;
                  }
               
                  private String convertStreamToString(InputStream is)
                          throws IOException {
                      //
                      // To convert the InputStream to String we use the
                      // Reader.read(char[] buffer) method. We iterate until the
                      // Reader return -1 which means there's no more data to
                      // read. We use the StringWriter class to produce the string.
                      //
                      if (is != null) {
                          Writer writer = new StringWriter();

                          char[] buffer = new char[1024];
                          try {
                              Reader reader = new BufferedReader(
                                      new InputStreamReader(is, "UTF-8"));
                              int n;
                              while ((n = reader.read(buffer)) != -1) {
                                  writer.write(buffer, 0, n);
                              }
                          } finally {
                              is.close();
                          }
                          return writer.toString();
                      } else {        
                          return "";
                      }
                  }
        }
 
  private class DownloadFilesTaskSanto extends AsyncTask<Void, Void, String> {
                private String html;
                @Override
            protected String doInBackground(Void... params) {
                  URL u = null;
                        try {
                                u = new URL("[url=http://www.floscarmeli.org/modules.php?name=Santo"]Flos Carmeli: You are using an invalid IP[/url]);
                        } catch (MalformedURLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                                  InputStream is = null;
                                try {
                                        is = u.openStream();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                try {
                                        html = convertStreamToString(is);
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                               
                                String r = new String(extract(html));
                                return r;
            }
               
                  @Override
              protected void onPostExecute(String r) {

                 // aggiorno i campi
                 wb1.loadData(r, "text/html", "UTF-8");

              }
                 
           
                  public String extract(String res){
                          String s1 = new String("Il Santo del giorno");
                          String s2 = new String("www.lalode.com");
                          String ris = new String(res.substring(res.indexOf(s1), res.indexOf(s2)));
                         
                          return clean(ris);
                  }
               
                  private String convertStreamToString(InputStream is)
                          throws IOException {
                      //
                      // To convert the InputStream to String we use the
                      // Reader.read(char[] buffer) method. We iterate until the
                      // Reader return -1 which means there's no more data to
                      // read. We use the StringWriter class to produce the string.
                      //
                      if (is != null) {
                          Writer writer = new StringWriter();

                          char[] buffer = new char[1024];
                          try {
                              Reader reader = new BufferedReader(
                                      new InputStreamReader(is, "UTF-8"));
                              int n;
                              while ((n = reader.read(buffer)) != -1) {
                                  writer.write(buffer, 0, n);
                              }
                          } finally {
                              is.close();
                          }
                          return writer.toString();
                      } else {        
                          return "";
                      }
                  }
        }

String clean(String st){
        return Html.fromHtml(st).toString();
}
}

Allego il logcat dopo la pressione del bottone1 che avvia DownloadFilesTaskSanto:


08-23 09:46:20.953: E/Trace(624): error opening trace file: No such file or directory (2)
08-23 09:46:21.553: D/gralloc_goldfish(624): Emulator without GPU emulation detected.
08-23 09:46:21.983: I/Choreographer(624): Skipped 33 frames!  The application may be doing too much work on its main thread.
08-23 09:47:58.683: D/dalvikvm(624): GC_CONCURRENT freed 194K, 4% free 8238K/8519K, paused 101ms+7ms, total 153ms
08-23 09:47:58.683: D/dalvikvm(624): WAIT_FOR_CONCURRENT_GC blocked 30ms