使用AsyncTask进行HTML解析会使主线程变慢

问题描述 投票:1回答:1

我正在尝试下载HTML源代码并提取文本以使用它。但是html的编码不是很好,它在一个表中,我想不出其他方法来提取它,而我正在使用带有模式和匹配器的正则表达式来提取它。我正在执行2次下载和解析任务。第一项任务做得很好,没有任何问题,但是当我尝试执行第二项任务时,它跳过了帧并说您在主线程上做得太多,但是这些操作在AsyncTask中进行。我的AsyncDownload任务

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

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream input = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(input);
            int data = reader.read();

            while (data != -1) {
                char current = (char) data;
                result += current;
                data = reader.read();
            }
            return result;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

第一个完美执行的解析任务

public void getTheCourses() {
    DownloadTheCoursesTask coursesTask = new DownloadTheCoursesTask();
    String result = "";

    try {
        result = coursesTask.execute("http://www.sis.itu.edu.tr/tr/ders_programlari/LSprogramlar/prg.php").get();
        coursesResult = new ArrayList<String>();
        Pattern firstPattern = Pattern.compile("<option  value=\"(.*?)\">");
        Matcher firstMatcher = firstPattern.matcher(result);

        while (firstMatcher.find()) {
            coursesResult.add(firstMatcher.group(1));
        }

    }catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

第二个解析任务使我的应用程序崩溃并说跳过帧

public void getTheQuota(){
    DownloadTheCoursesTask quotaTask = new DownloadTheCoursesTask();
    String result = "";
    try {
        result = quotaTask.execute("http://www.sis.itu.edu.tr/tr/ders_programlari/LSprogramlar/prg.php?fb=BEB").get();
        Pattern p = Pattern.compile("<html><head>(.*?)</html>");
        Matcher m = p.matcher(result);
        while (m.find()) {
            quotaResult.add(m.group(1));
        }

    }catch (InterruptedException e){
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}

[许多人说使用jSoup,但是我的第一个任务运行得很好。我该怎么办?

android multithreading android-asynctask
1个回答
1
投票

请勿使用.get()成员执行AsyncTask,因为它将在主线程上运行。

不执行并处理doInBackground()中的onPostExecute()的结果。

所以您的第一个任务也已经是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.