我正在尝试下载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,但是我的第一个任务运行得很好。我该怎么办?
请勿使用.get()
成员执行AsyncTask,因为它将在主线程上运行。
不执行并处理doInBackground()
中的onPostExecute()
的结果。
所以您的第一个任务也已经是错误的。