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