Reputation: 203
I want to parse an html page in my listview in my app android, I'm developing for android. I would like this app to parse an html page, but when I start the application it crashes! And I got by logcat this error:
09-05 20:59:29.734 983-999/com.app.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NoClassDefFoundError: org.jsoup.Jsoup
at com.app.myapplication.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:84)
at com.app.myapplication.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:39)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
This is the code Java AsyncTask:
private class ParsingPaginaWeb extends AsyncTask<String,String,String> {
ArrayList<String> titoli; //lista dei titoli
ArrayList<String> descrizioni; //lista delle descrizioni
@Override
protected void onPreExecute()
{
//prima di eseguire il parsing inizializzo gli arraylist
titoli = new ArrayList<String>();
descrizioni = new ArrayList<String>();
}
@Override
protected String doInBackground(String... params) {
/*
* Qui si effettua il parsing. Come esempio prendiamo il sito di anddev.it
* Questo, lo ripeto, � solo un esempio, in quanto il parsing cambia
* completamente in base al sito da cui prendere i dati.
*
*
* In questo caso vogliamo prendere dalla home di anddev.it i titoli
* delle varie sezioni del forum e la relativa descrizione.
* Quindi analizzando un po il codice html notiamo che:
*
* 1- La home � organizzata in tabella con classe "table_list"
*
* 2- All'interno c'� una alternanza di tbody con classe header e content.
* A noi interessano quelli con classe content
*
* 3- All'interno di ogni tbody con classe "content" ci interessa ogni riga con
* classe "windowbg2", che contengono i dati da recuperare
*
* 4- All'interno di ogni riga ci interessa il testo contenuto nel tag <a> con
* classe "subject" che contiene il titolo e quello nel tag <p>
* che contiene la descrizione.
*
* Adesso abbiamo tutte le informazioni che ci servono per fare il parsing
*/
try {
// NB: controllate di importare le classi giuste
// all'inizio ci deve essere org.jsoup
// ricavo l'html della pagina con user agent desktop (Chrome)
// e timeout 30000
Document doc = Jsoup.connect("http://mega-search.me/search?k=")
.userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
.timeout(30000).get();
// prendo la tabella
// (con .first() ottengo il primo elemento, in questo caso l'unico )
Elements links = doc.select(".link");
for( Element link: links )
{
String href = link.attr("href");
Elements titles = link.select( ".title" );
String title = ( links.size() > 0 ) ? links.get( 0 ).toString() : "";
titoli.add(title);
descrizioni.add(href);
}
// inserisco nei rispettivi arraylist
} 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(String result)
{
// dopo che ho eseguito il parsing mostro i dati nella listview
// usando il custom array adpater ParsingArrayAdapter
ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli, descrizioni);
lista.setAdapter(adapter);
}
}
Upvotes: 1
Views: 256
Reputation: 313
On Eclipse : right click on your project, properties, JAVA Build Paths, in the Order and Export tab, tick your library. Then on the main menu of Eclipse, "Project" and "Clean"
If your application needs to connect to the internet, do not forget to add the PERMISSION into the Manifest :
<uses-permission android:name="android.permission.INTERNET" />
OPTIONAL : <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Upvotes: 1