Java Android多线程HTML解析

Java Android多线程HTML解析,java,android,multithreading,android-asynctask,asynctaskloader,Java,Android,Multithreading,Android Asynctask,Asynctaskloader,我正在开发需要html解析的应用程序。因此,我目前正在AsyncTaskLoader中使用jsoup,如下所示(示例): 这只不过是一页纸,几乎没有。我注意到它的速度不是很好。所以,我被告知,我应该考虑做多线程和解析这些网页在单独的线程在同一时间,所以它会更快。现在我有几个问题: 我应该仍然使用AsyncTaskLoader或AsyncTask,还是有其他更好的解决方案?我想知道这件事的最佳做法是什么 有谁能给我介绍一下如何在android中执行多线程的教程/示例吗 谢谢;) AsyncTask

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

这只不过是一页纸,几乎没有。我注意到它的速度不是很好。所以,我被告知,我应该考虑做多线程和解析这些网页在单独的线程在同一时间,所以它会更快。现在我有几个问题:

  • 我应该仍然使用AsyncTaskLoader或AsyncTask,还是有其他更好的解决方案?我想知道这件事的最佳做法是什么
  • 有谁能给我介绍一下如何在android中执行多线程的教程/示例吗

  • 谢谢;)

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

    发件人:

    首次引入时,AsyncTasks是在单个服务器上串行执行的 背景线程。从甜甜圈开始,它被改成了一个 允许多个任务并行运行的线程。从 蜂窝,任务在单个线程上执行,以避免常见的 并行执行导致的应用程序错误

    如果确实需要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,对象[])与 线程池执行器


    你没有说有多少页面需要解析,所以请确保将同时执行的任务数量限制在合理的范围内。

    好吧,当应用程序加载时,总有4个页面需要解析,当用户请求时,还有2个页面需要解析。所以AsyncTask应该有点像主后台线程,我必须在其中运行其他线程(如果是这样的话,我应该如何告诉AsyncTask线程是否所有页面都已解析,并且我可以关闭这些子后台线程?)?或者我应该创建6个单独的任务,并使用这个单独运行它们。ExecuteOneExecutor()?还有,难道没有人说AsyncTask“过时”了吗?或者这只是一个谣言?@enVGuy-您提出这些问题的事实表明,需要更多地了解编写多线程代码、在线程之间编组数据、锁等的基本原理和基础。。。。我建议你读下面这本书:还有。
    @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;
    }