【问题标题】:Android: Reading multiple rss feeds as fast as possible using asynctask / threadsAndroid:使用异步任务/线程尽可能快地读取多个 RSS 提要
【发布时间】:2012-01-11 19:30:46
【问题描述】:

我有一个应用程序,它可以读取大约 3-5 个 RSS 提要并在 UI 上显示标题。我已将阅读代码放在异步任务中以保持 UI 响应。但是我的代码一次读取一个提要,我想同时阅读 3 个 rss 提要,看看我是否可以加快解析过程并在 UI 上更快地显示标题。

我曾尝试使用线程 - 但后来我遇到了一个问题,我不知道哪个线程将首先完成,第二个和最后一个......好吧,我只是不知道如何检查何时最慢的线程已经完成,所以我可以按日期和时间对 rss 新闻对象进行排序。所以最终我尝试使用 asynctask 一次读取一个提要,如下所示:

class ReadFeedsTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... unused) {

    try {

        URL url = new URL("http://www.fyens.dk/rss/sport");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = conn.getInputStream();

            DocumentBuilderFactory dbf = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(is);
            Element element = document.getDocumentElement();

            NodeList nodeList = element.getElementsByTagName("item");

            if (nodeList.getLength() > 0) {
                for (int i = 0; i < nodeList.getLength(); i++) {

                    Element entry = (Element) nodeList.item(i);

                    Element _titleE = (Element) entry.getElementsByTagName(
                            "title").item(0);
                    Element _descriptionE = (Element) entry
                            .getElementsByTagName("description").item(0);
                    Element _pubDateE = (Element) entry
                            .getElementsByTagName("pubDate").item(0);
                    Element _linkE = (Element) entry.getElementsByTagName(
                            "link").item(0);

                    String _title = _titleE.getFirstChild().getNodeValue();
                    String _description = _descriptionE.getFirstChild().getNodeValue();
                    Date _pubDate = new Date(_pubDateE.getFirstChild().getNodeValue());
                    String _link = _linkE.getFirstChild().getNodeValue();

等等。

然后我对其他 rss 提要重复此过程。

如何使用此代码同时读取多个提要 - 如果不使用 asynctasc 然后使用线程?我的问题是我无法理解如何等到所有线程都完成后才能对结果进行排序并首先呈现最新的?

【问题讨论】:

    标签: android multithreading rss android-asynctask feed


    【解决方案1】:

    AsyncTask 创建生命周期实际上是由隐藏在所有 API 级别的线程池管理的,这个线程池从 API 级别 11 开始可以访问,但是,这并不意味着我们不能在 API 级别 11 之前创建多个 AsyncTask 实例,请查看我的 SO 问题 here 了解更多详情。

    回到你的话题,你总是可以预先分析你的问题集并将它们拆分/缩放为子集,例如,总共 100 个 RSS 提要可以拆分为 5 个块(每个块依次执行 20 个 RSS 提要),然后将这些预处理的子集馈送到 5 个 AsyncTask 中:

    ArrayList<ProblemSet> problemSets = splitBigProblemSet();
    for (ProblemSet problemSet : problemSets) {
      new ProblemResolverAsynTask().execute(problemSet);
    }
    

    这将为您提供 5 个异步运行的 AsyncTask,并且可能比使用 1 个 AysncTask 下载 100 个 RSS 提要快 5 倍。请注意,也可以为每个 RSS 提要创建 AsyncTask,这在 IMO 是一种非常糟糕的做法,因为如果您的问题集很大,它会占用您的内存并迅速杀死系统。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我的思考过程是这样的:

      1. 创建所有提要的列表。
      2. 从 1 到最大线程数,生成一个新线程以从提要中检索数据
      3. 当一个线程完成时,检查列表以检查剩余的提要;如果还有更多,请从列表中删除提要并从提要中检索数据
      4. 每个线程在完成后,会将其检索到的提要的数据添加到您用于列表适配器的任何数据源,对数据源进行排序,并通知列表数据集已更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 2013-08-31
        相关资源
        最近更新 更多