0

我正在開發需要html解析的應用程序。所以,我目前使用jsoup在AsyncTaskLoader像這樣(例如):使用多線程解析Android 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與 THREAD_POOL_EXECUTOR(java.util.concurrent.Executor,對象[])。

你沒有說有多少頁面需要解析,所以只要確保你將同步任務的數量限制在一個合理的數量。

+0

那麼,應用程序加載時總會有4個頁面需要解析,並且當用戶請求時,還有2個頁面需要解析。所以AsyncTask應該有點像主後臺線程,我必須在其中運行其他線程(如果這是想法,如果解析了所有頁面,我應該如何告訴AsyncTask線程,並且我可以關閉這些子後臺線程?)?或者我應該做6個獨立的任務,並使用這個.exectureOnExecutor()單獨運行它們?附:是不是有人說AsyncTask是'過時的'?或者這只是一個謠言? – env 2014-08-31 19:58:23

+1

@enVGuy - 您提出這些問題的事實表明需要了解更多關於編寫多線程代碼,編制線程之間的數據,鎖等的基礎知識和基礎知識......我建議您閱讀以下書籍:[本書] (http://amzn.com/1449364136)和[this one](http://amzn.com/0201310090)。 – selbie 2014-08-31 20:47:26