使用 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 使主线程变慢的主要内容,如果未能解决你的问题,请参考以下文章