Android:使用asynctask/threads尽可能快地读取多个rss提要

Android:使用asynctask/threads尽可能快地读取多个rss提要,android,multithreading,rss,android-asynctask,feed,Android,Multithreading,Rss,Android Asynctask,Feed,我有一个应用程序,可以阅读大约3-5个rss提要,并在UI上显示标题。我将读取代码放在asynctask中,以保持UI的响应性。但是我的代码一次读取一个提要,我想同时读取3个rss提要,看看是否可以加快解析过程并在UI上更快地显示标题 我曾经尝试过使用线程,但后来我遇到了一个问题,我不知道哪个线程会在第一个、第二个、最后一个和。。嗯,我只是不知道如何检查最慢的线程何时完成,以便我可以按日期和时间对rss新闻对象进行排序。因此,我最终尝试使用asynctask一次读取一个提要,如下所示: clas

我有一个应用程序,可以阅读大约3-5个rss提要,并在UI上显示标题。我将读取代码放在asynctask中,以保持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();
类ReadFeedsTask扩展异步任务{ @凌驾 受保护的空位背景(空位…未使用){ 试一试{ URL=新URL(“http://www.fyens.dk/rss/sport"); HttpURLConnection conn=(HttpURLConnection)url.openConnection(); if(conn.getResponseCode()==HttpURLConnection.HTTP\u确定){ InputStream is=conn.getInputStream(); DocumentBuilderFactory dbf=DocumentBuilderFactory .newInstance(); DocumentBuilder db=dbf.newDocumentBuilder(); Document Document=db.parse(is); Element=document.getDocumentElement(); NodeList NodeList=element.getElementsByTagName(“项”); if(nodeList.getLength()>0){ for(int i=0;i 等等

然后我对其他rss提要重复这个过程


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

我的思考过程如下:

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();
  • 创建所有提要的列表
  • 从1到最大线程数,生成一个新线程以从提要检索数据
  • 当一个线程完成时,检查列表中是否有剩余的提要要检查;如果还有更多提要,则从列表中删除提要并从提要中检索数据
  • 完成后,每个线程都会将检索到的提要的数据添加到列表适配器使用的任何数据源中,对数据源进行排序,并通知列表数据集已更改

  • AsyncTask创建生命周期实际上由隐藏在所有API级别中的线程池管理,该线程池自API级别11起可访问,但是,这并不意味着我们不能在API级别11之前创建多个AsyncTask实例,有关更多详细信息,请查看我的SO问题

    回到您的主题,您始终可以预分析您的问题集并将其拆分/缩放为子集,例如,总共100个rss提要可以拆分为5个块(每个块按顺序执行20个rss提要),然后将这些预处理的子集分为5个任务:

    ArrayList<ProblemSet> problemSets = splitBigProblemSet();
    for (ProblemSet problemSet : problemSets) {
      new ProblemResolverAsynTask().execute(problemSet);
    }
    
    ArrayList ProblemSet=splitBigProblemSet();
    for(问题集问题集:问题集){
    新ProblemResolvarAsynTask().execute(problemSet);
    }
    
    这将为您提供5个异步运行的AsyncTask,速度可能是使用1个AysncTask download 100 RSS提要的5倍。请注意,也可以为每个RSS提要创建AsyncTask,这是一个非常糟糕的做法,因为如果您的问题集很大,它将消耗您的内存并很快杀死系统

    希望这有帮助