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 构建路径,在 Order and Export 选项卡中,勾选您的库。然后在Eclipse的主菜单上,“Project”和“Clean”

如果您的应用程序需要连接到 Internet,请不要忘记将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 回答