首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:使用asynctask /thread尽可能快地阅读多个rss提要

Android:使用asynctask /thread尽可能快地阅读多个rss提要
EN

Stack Overflow用户
提问于 2011-12-03 04:01:23
回答 2查看 2.1K关注 0票数 4

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

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

代码语言:javascript
复制
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提要重复此过程。

如何使用此代码同时读取多个提要-如果不使用异步,则使用线程?我的问题是,我不能理解如何等待,直到所有线程都完成,这样我才能对结果进行排序,并首先呈现最新的结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-03 04:19:22

我的思维过程是这样的:

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

<代码>G29

票数 0
EN

Stack Overflow用户

发布于 2011-12-03 05:45:18

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

回到你的主题,你总是可以预先分析你的问题集,并将其拆分/缩放为子集,例如,总共100个rss feed可以被分成5个分块(每个分块依次执行20个RSS feed ),然后将这些预处理的子集分成5个AsyncTask:

代码语言:javascript
复制
ArrayList<ProblemSet> problemSets = splitBigProblemSet();
for (ProblemSet problemSet : problemSets) {
  new ProblemResolverAsynTask().execute(problemSet);
}

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

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8361929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档