[英]Creating a JSoup class in android using AsyncTask
我知道我必须使用ASyncTasks才能使JSoup适用于android,但是在线上的所有示例都说明了这一点,只需在MainActivity
使用随机的jsoup方法即可。
我想创建一个HTMLParser
类,该类将为要解析的每个元素包含一个函数,但似乎无法使其正常工作。
我的HTMLParser
:
public class HTMLParser extends AsyncTask<Void, Void, Void> {
private Document doc;
@Override
protected Void doInBackground(Void... voids) {
try {
doc = Jsoup.connect("https://www.bodybuilding.com/exercises").get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public ArrayList<String> findMuscleGroups(){
ArrayList<String> muscleGroups = new ArrayList<>();
Elements section = doc.select("a");
if (section != null) {
for (Element exercise : section) {
if (exercise.hasText() && !muscleGroups.contains(exercise.text()) &&
exercise.attr("href").contains("exercises/muscle")) {
muscleGroups.add(exercise.text());
}
}
}
return muscleGroups;
}
}
在我的MainActivity
我希望能够创建HTMLParser
对象,并能够使用类似ArrayList = htmlParser.findMuscleGroups()
我的MainActivity
:
HTMLParser parser = new HTMLParser();
new HTMLParser().execute();
for (String muscleGroup : parser.findMuscleGroups()){
textView.setText(muscleGroup + "\n");
}
哪个行不通。 我很清楚,它不应该起作用,我缺少一些东西,但我希望你们能为我指明正确的方向。
解:
可能不是最好的,但是它可以工作,因此
我已将此添加到HTMLParser
类
public Document initializeDoc(){
try {
Document doc = Jsoup.connect("https://www.bodybuilding.com/exercises").get();
return doc;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
在MainActivity
我创建了
private volatile Document doc = null;
private volatile HTMLParser htmlParser;
变量,并在onCreate
方法中添加了以下内容
htmlParser = new HTMLParser();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
doc = htmlParser.initializeDoc();
}
});
try {
t.start();
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
不用说,调用htmlParser.findMuscleGroups(doc)
可以按预期工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.