Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jsoup将HTML表解析为android listview_Java_Android_Android Listview_Android Asynctask - Fatal编程技术网

Java 使用jsoup将HTML表解析为android listview

Java 使用jsoup将HTML表解析为android listview,java,android,android-listview,android-asynctask,Java,Android,Android Listview,Android Asynctask,我正在开发一个需要html表的应用程序。在寻找正确的代码和解决错误的斗争之后。我遇到了一个错误,我不知道如何解决它。我已经发现我需要一个扩展Async的类。唯一的问题是我真的不知道如何使用异步。我得到的错误是Async:fatal exception:AsyncTask 1的致命异常。这对于下一步要做什么或者如何解决这个问题不是很清楚。所以我希望有人能帮助我 最后一段代码是将表放入ArrayList,最后放入列表视图 这是我的代码: 看起来您在尝试连接到上面提到的站点页面时遇到异常,然后控件转到

我正在开发一个需要html表的应用程序。在寻找正确的代码和解决错误的斗争之后。我遇到了一个错误,我不知道如何解决它。我已经发现我需要一个扩展Async的类。唯一的问题是我真的不知道如何使用异步。我得到的错误是Async:fatal exception:AsyncTask 1的致命异常。这对于下一步要做什么或者如何解决这个问题不是很清楚。所以我希望有人能帮助我

最后一段代码是将表放入ArrayList,最后放入列表视图

这是我的代码:


看起来您在尝试连接到上面提到的站点页面时遇到异常,然后控件转到catch块,然后访问未初始化的变量文档,这就是为什么会遇到异常

使用抛出或运行时包装技巧查找真正的原因:

} catch (IOException e) {
        throw new RuntimeException(e);
}
阿罗哈

在try-catch语句中输入所需的代码。在try-catch语句之外尝试使用变量时,变量超出范围。第29行的object元素试图引用最初声明的文档对象,该文档对象仍然为null。这应该会让它为你工作

    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);
    }
}

您应该在代码中显示第29行的位置。谢谢您的帮助。NullPointerException消失了,但现在唯一的问题是从网站检索数据。我现在有一个没有数据的空白页。为了访问您的数据,您需要在onPostExecute中检索它。有关更多详细信息,请查看
    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();
        }

    }
}
   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);
    }
}
@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();