0

Я разрабатываю приложение, которое требует разбора html. Итак, я в настоящее время использую jsoup в AsyncTaskLoader, как это (пример):Анализ HTML-файлов с помощью многопоточности

@Override 
public Boolean loadInBackground() { 
    try { 
     Connection.Response response = Jsoup.connect(getContext().getString(R.string.url_login)) 
       .data("id", account_id, "password", account_password) 
       .timeout(5000) 
       .method(Connection.Method.POST) 
       .execute(); 

     String cookie = response.cookie("JSESSIONID"); 

     Document document = Jsoup.connect(getContext().getString(R.string.url_schedule)) 
       .cookie("JSESSIONID", cookie) 
       .get(); 

      Element table = document.select("table").first(); 
      if (table != null) { 
       databaseHandler.openDatabase(); 
       databaseHandler.getDatabase().beginTransaction(); 
       try { 
        for (Element row : table.select("tr")) { 
         Elements columns = row.select("td"); 
          addItem(columns, DatabaseHandler.getTableName()); 
        } 
        databaseHandler.getDatabase().setTransactionSuccessful(); 
       } finally { 
        databaseHandler.getDatabase().endTransaction(); 
       } 
       databaseHandler.closeDatabase(); 
      } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

Это только одна страница скрип и есть некоторые из них. И я заметил, что скорость его не очень хорошая. Итак, мне сказали, что я должен рассмотреть возможность многопоточности и разобрать все эти страницы в отдельных потоках одновременно, чтобы это было быстрее. Теперь у меня есть несколько вопросов:

  1. Должен ли я использовать AsyncTaskLoader или AsyncTask, или есть что-то еще (лучше) для этого решения? Я хочу знать, что лучше всего подходит для этой цели.
  2. Может ли кто-нибудь привести меня к учебникам/примерам, как делать многопоточность в android?

Спасибо;)

ответ

0

AsyncTask должны работать хорошо для этого. Однако, согласно документам для AsyncTask, по умолчанию модель по-прежнему является «одной задачей одновременно», если вы не используете метод executeOnExecutor.

От http://developer.android.com/reference/android/os/AsyncTask.html:

Когда впервые, AsyncTasks были выполнены поочередно на одном фоновом потоке. Начиная с DONUT, это было изменено на пул из потоков, что позволяет нескольким задачам работать параллельно. Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений , вызванных параллельным выполнением.

Если вы действительно хотите параллельного выполнения, вы можете вызвать executeOnExecutor (java.util.concurrent.Executor, Object []) с THREAD_POOL_EXECUTOR.

Вы не сказали, сколько страниц нужно было анализировать, поэтому просто убедитесь, что количество одновременных заданий ограничено разумным числом.

+0

Ну, всегда есть 4 страницы, которые нужно разобрать, когда приложение загружается, а еще 2, когда пользователь запрашивает. Таким образом, AsyncTask должен быть как основной фоновый поток, и я должен запускать в нем другие потоки (и если это идея, как я должен указывать на поток AsyncTask, если все страницы были проанализированы, и я могу закрыть эти потоки дочернего фона ?)? Или я должен сделать 6 отдельных задач и выполнить их все отдельно с помощью этого .exectureOnExecutor()? Постскриптум Разве нет людей, которые говорят, что AsyncTask устарел? Или это просто слухи? – env

+1

@enVGuy - Тот факт, что вы задаете эти вопросы, показывает необходимость узнать больше об основах и основах написания многопоточного кода, сортировки данных между потоками, блокировками и т. Д. Я предлагаю следующую книгу: [эта книга] (http://amzn.com/1449364136) и [этот] (http://amzn.com/0201310090). – selbie

Смежные вопросы