【问题标题】:Android HTML parsing with multithreading使用多线程解析 Android HTML
【发布时间】:2014-08-31 18:42:41
【问题描述】:

我正在开发需要 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 中执行多线程的教程/示例?

谢谢 ;)

【问题讨论】:

    标签: java android multithreading android-asynctask asynctaskloader


    【解决方案1】:

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

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

    在首次引入时,AsyncTask 是在单个 后台线程。从 DONUT 开始,这变成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单线程上执行,避免常见 并行执行导致的应用程序错误。

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

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

    【讨论】:

    • 嗯,当应用程序加载时,总是有 4 个页面需要解析,当用户请求时,还有 2 个页面需要解析。所以 AsyncTask 应该有点像主后台线程,我必须在其中运行其他线程(如果是这样的话,如果所有页面都被解析,我应该如何告诉 AsyncTask 线程,我可以关闭这些子后台线程?)?或者我应该做 6 个单独的任务并用这个 .exectureOnExecutor() 分别运行它们?附:没有人说 AsyncTask 是“过时的”吗?还是只是谣言?
    • @enVGuy - 您提出这些问题的事实表明,需要更多地了解编写多线程代码、在线程、锁等之间编组数据的基础知识。我建议以下书:this bookthis one 以及。
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多