使用AsyncTask在android中创建JSoup类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AsyncTask在android中创建JSoup类相关的知识,希望对你有一定的参考价值。

我知道我必须使用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 + "
");
}

哪个不行。我很清楚,它不应该起作用,有些东西我不知道,但我希望你们能指出我正确的方向。

答案

解:

可能不是最好的,但它确实有效

我已经添加了这个toHTMLParser

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)按预期工作

以上是关于使用AsyncTask在android中创建JSoup类的主要内容,如果未能解决你的问题,请参考以下文章

别再傻傻得认为AsyncTask只可以在主线程中创建实例和调用execute方法

在 AsyncTask doInBackground 中创建 140,000 行 SQLite 数据库需要很多很多分钟

android AsyncTask 怎么返回值给UI线程

即使在使用 AsyncTask 之后,编舞者也会跳帧(最多 400 个!)

为啥Android的AsyncTask不适合执行长时间操作的任务

使用 Android 版 PhoneGap:无法在数据库中创建表