1

アプリ Android のリストビューで html ページを解析したいのですが、Android 用に開発しています。このアプリで HTML ページを解析したいのですが、アプリケーションを起動するとクラッシュします。そして、logcatでこのエラーが発生しました:

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)

これはコード 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);
        }

    }
4

1 に答える 1

1
  • ライブラリが正しく設定されていません。

Eclipse の場合: プロジェクト、プロパティ、JAVA ビルド パスを右クリックし、[注文とエクスポート] タブでライブラリにチェックマークを付けます。次に、Eclipseのメインメニューで、「プロジェクト」と「クリーン」

アプリケーションがインターネットに接続する必要がある場合は、 PERMISSIONを Manifestに追加することを忘れないでください。

<uses-permission android:name="android.permission.INTERNET" />

OPTIONAL : <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2013-09-05T22:13:39.057 に答える