[英]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.