2017-02-11 5 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

О, я не знал, что спасибо. Так что я удалю get и я добавлю операцию синтаксического анализа в onPostExecute правильно? – Alperen

+0

Ну, вы должны делать много времени в doInBackGround. Итак, синтаксический анализ тоже. – greenapps

+0

Хорошо, спасибо за ответ. – Alperen