2017-02-11 51 views
1

我想下载一个HTML源代码并提取文本以便使用它。但是HTML没有很好地编码它在一张桌子里,我想不出以不同的方式提取它,我用正则表达式与模式和匹配提取它。我正在做下载和解析任务2次。第一个任务做得很好,没有任何问题,但是当我尝试做第二个任务时,它跳过帧,并说你在做什么在主线程上太多,但在AsyncTask中执行这些操作。 我AsyncDownload任务HTML解析使用AsyncTask使主线程缓慢

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,因为它会在主线程上运行。

请不要处理doInBackground()的结果onPostExecute()

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

+0

哦,我不知道那谢谢你。所以我将删除获得,我会将解析操作添加到onPostExecute的权利? – Alperen

+0

那么你应该在doInBackGround中做耗时的操作。所以解析也是如此。 – greenapps

+0

好的,非常感谢你的回答。 – Alperen