使用 AsyncTask 解析 HTML 使主线程变慢

Posted

技术标签:

【中文标题】使用 AsyncTask 解析 HTML 使主线程变慢【英文标题】:HTML Parsing With AsyncTask makes the main thread slow 【发布时间】:2017-06-29 18:49:11 【问题描述】:

我正在尝试下载 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】:

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

不要在onPostExecute()中处理doInBackground()的结果。

所以你的第一个任务也已经错了。

【讨论】:

哦,我不知道,谢谢。所以我将删除 get 并将解析操作添加到 onPostExecute 对吗? 那么你应该在 doInBackGround 中进行耗时的操作。所以解析也是。

以上是关于使用 AsyncTask 解析 HTML 使主线程变慢的主要内容,如果未能解决你的问题,请参考以下文章

Android AsyncTask解析

Android AsyncTask完全解析,带你从源码的角度彻底理解

为啥我的 QThread 正在使主线程挨饿?

如何使主活动线程影响第二个活动

AsyncTask原理

如何使用AsyncTask