簡體   English   中英

使用jsoup將HTML表解析為android listview

[英]Parsing a HTML table with jsoup to android listview

我正在一個需要html表的應用程序上工作。 經過努力尋找正確的代碼並解決錯誤。 我遇到一個錯誤,我不知道該如何解決。 我已經知道我需要一個擴展Async <>的類。 唯一的問題是我真的不知道如何使用異步。 我得到的錯誤是Async的致命異常:“致命異常:AsyncTask#1”。 這對於下一步做什么或如何解決尚不十分清楚。 所以我希望有人能幫助我。

最終的代碼是將表放入ArrayList中,最后將其放入列表視圖中。

這是我的代碼:

行號編碼

public class Cluka2 extends AsyncTask<Void, Void, String> {

    Document document = null;
    public ArrayList<String> list = new ArrayList<>();

    @Override
    protected String doInBackground(Void... params) {

        try {
            document = Jsoup.connect("https://tennisnaarden.planmysport.com/portal/page/pmsportal30/TVNaarden/Toernooien/Clubtoernooi").get();
           // System.out.println(document);
          //  Log.e("DEBUG", document.toString());
           // Log.v("Debug", document.toString());

        } catch (IOException e) {
            e.printStackTrace();
        }
        Elements elements = document.select("#pcnt1383_8158836_1383_4326089_4326089 td:first-child");

        for(int i=0;i<elements.size();i++)
        {

            list.add(elements.get(i).text());
            System.out.println(elements.get(i).text());

        }
        System.out.println(list);
        return list.toString();
    }
}

這是我的錯誤:

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:841)
     Caused by: java.lang.NullPointerException
            at com.example.gebruiker.tvnaardentoernooien.Cluka2.doInBackground(Cluka2.java:29)
            at com.example.gebruiker.tvnaardentoernooien.Cluka2.doInBackground(Cluka2.java:12)
            at android.os.AsyncTask$2.call(AsyncTask.java:287)
            at java.util.concurrent.FutureTask.run(FutureTask.java:234)
            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:841)

看起來您在嘗試連接到提到的站點頁面時遇到異常,然后控制轉到catch塊,然后訪問未初始化的變量文檔 ,這就是為什么要獲得NPE的原因。

使用throws或只是運行時包裝技巧來找出真正的原因:

} catch (IOException e) {
        throw new RuntimeException(e);
}

阿羅哈

將您要求的代碼放入try catch語句中。 當您嘗試在try catch語句之外使用變量時,該變量超出范圍。 第29行的對象Elements正在嘗試引用最初聲明為null的Document對象。 那應該使它為您工作。

    public class Cluka2 extends AsyncTask<Void, Void, String> {

    Document document = null;
    public ArrayList<String> list = new ArrayList<>();

    @Override
    protected String doInBackground(Void... params) {

        try {
            document = Jsoup.connect("https://tennisnaarden.planmysport.com/portal/page/pmsportal30/TVNaarden/Toernooien/Clubtoernooi").get();
           // System.out.println(document);
           //  Log.e("DEBUG", document.toString());
           // Log.v("Debug", document.toString());
           Elements elements = document.select("#pcnt1383_8158836_1383_4326089_4326089 td:first-child");

           for(int i=0;i<elements.size();i++)
           {

            list.add(elements.get(i).text());
            System.out.println(elements.get(i).text());

           }
           System.out.println(list);
           return list.toString();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

您的代碼應類似於上面的代碼。 您對文檔檢索的數據所做的任何工作都應在try catch中處理。 另外,由於要將這些元素添加到arraylist中,因此它也必須位於try catch中。 這樣可以避免觸發空指針異常。 至於您的AsyncTask,只需記住AsyncTask的生命周期(onPreExecute,doInBackground,postExecute和onProgressUpdate),您就應該做好了。

經過很多努力,這是我解決問題的方法:

這是我的類,用於連接URL和獲取html數據

   public class ClubkampioenschappenOnderdelenHTMLRequest extends AsyncTask<Void, Void, String> {

    Document document = null;
    public List<String> list = new ArrayList<>();
    private ListView listView;
    private Context context = null;


    public ClubkampioenschappenOnderdelenHTMLRequest(ArrayList<String> list, Context mContext, ListView ListView) {
        this.list = list;
        context= mContext;
        this.listView = ListView;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    @Override
    protected String doInBackground(Void... params) {


        try {
            URL url = new URL("https://tennisnaarden.planmysport.com/portal/page/pmsportal30/TVNaarden/Toernooien/Clubtoernooi");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "text/html");
            conn.connect();

            InputStreamReader input = new InputStreamReader((InputStream) conn.getContent());
            BufferedReader reader = new BufferedReader(input);
            String line;
            String html = "";

            while((line = reader.readLine()) != null) {
                html += line;
            }

            document = Jsoup.parse(html);

            Elements elements = document.select("#pcnt1383_8158836_1383_4326089_4326089 td:first-child");

            for (int i = 0; i < elements.size(); i++) {
                list.add(elements.get(i).text());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return list.toString();
    }

    @Override
    protected void onPostExecute(String result) {
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(arrayAdapter);
    }
}

onCreate方法中的代碼:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clubkampioenschappen_singleen_dubbel);
        this.setTitle("Onderdelen");

        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

        if (networkInfo != null && networkInfo.isConnected()) {

            ListView Onderdelen = (ListView) findViewById(R.id.Onderdelen);
            ClubkampioenschappenOnderdelenHTMLRequest clucka = new ClubkampioenschappenOnderdelenHTMLRequest(list, ClubkampioenschappenSingleenDubbelOnderdelen.this, Onderdelen);
            clucka.execute();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM