0

我正在开发需要 html 解析的应用程序。所以,我目前在 AsyncTaskLoader 中使用 jsoup,如下所示(示例):

@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 中进行多线程处理的教程/示例?

谢谢 ;)

4

1 回答 1

0

AsyncTask 应该可以很好地解决这个问题。但是,根据 AsyncTask 的文档,它的默认模型仍然是“一次一个任务”,除非您使用 executeOnExecutor 方法。

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

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果你真的想要并行执行,你可以使用 THREAD_POOL_EXECUTOR 调用 executeOnExecutor(java.util.concurrent.Executor, Object[])。

您没有说要解析多少页,因此请确保将同时执行的任务数限制在合理的范围内。

于 2014-08-31T19:42:56.517 回答