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

时间:2017-02-11 12:46:52

标签: android multithreading android-asynctask

我正在尝试下载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,但我的第一个任务是完美运行。我能做些什么,谢谢。

1 个答案:

答案 0 :(得分:1)

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

请勿在{{1​​}}中处理doInBackground()的结果。

所以你的第一个任务也是错的。