android rss提要阅读器错误(重定向太多)

时间:2012-01-13 10:30:35

标签: android xml

嘿伙计们。我是Android编程的新手。我正在尝试使用从互联网上获得的教程从网站获取RSS源。但是,当我将URL更改为所需的网站ID时,程序将不会显示任何内容并显示此错误。

01-13 17:09:30.251: ERROR/RSS Handler IO(277): Too many redirects >> java.net.ProtocolException: Too many redirects

这是我的RSSReader.java页面

/**
* 
*/
package com.tmm.android.rssreader.reader;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import android.text.Html;
import android.util.Log;

import com.tmm.android.rssreader.util.Article;
import com.tmm.android.rssreader.util.RSSHandler;

/**
* @author rob
*
*/
public class RssReader {

private final static String BOLD_OPEN = "<B>";
private final static String BOLD_CLOSE = "</B>";
private final static String BREAK = "<BR>";
private final static String ITALIC_OPEN = "<I>";
private final static String ITALIC_CLOSE = "</I>";
private final static String SMALL_OPEN = "<SMALL>";
private final static String SMALL_CLOSE = "</SMALL>";

/**
 * This method defines a feed URL and then calles our SAX Handler to read the article list
 * from the stream
 * 
 * @return List<JSONObject> - suitable for the List View activity
 */
public static List<JSONObject> getLatestRssFeed(){
    //String feed = "http://globoesporte.globo.com/dynamo/futebol/times/vasco/rss2.xml";
    String feed = "http://www.flightstats.com/go/rss/flightStatusByRoute.do?guid=34b64945a69b9cac:-420d81e6:134c55649d7:-21c5&departureCode=cgk&arrivalCode=sub&departureDate=2012-01-13";
    RSSHandler rh = new RSSHandler();
    List<Article> articles =  rh.getLatestArticles(feed);
    Log.e("RSS ERROR", "Number of articles " + articles.size());
    return fillData(articles);
}


/**
 * This method takes a list of Article objects and converts them in to the 
 * correct JSON format so the info can be processed by our list view
 * 
 * @param articles - list<Article>
 * @return List<JSONObject> - suitable for the List View activity
 */
private static List<JSONObject> fillData(List<Article> articles) {

    List<JSONObject> items = new ArrayList<JSONObject>();
    for (Article article : articles) {
        JSONObject current = new JSONObject();
        try {
            buildJsonObject(article, current);
        } catch (JSONException e) {
            Log.e("RSS ERROR", "Error creating JSON Object from RSS feed");
        }
        items.add(current);
    }

    return items;
}


/**
 * This method takes a single Article Object and converts it in to a single JSON object
 * including some additional HTML formating so they can be displayed nicely
 * 
 * @param article
 * @param current
 * @throws JSONException
 */
private static void buildJsonObject(Article article, JSONObject current) throws JSONException {
    String title = article.getTitle();
    String description = article.getDescription();
    String date = article.getPubDate();
    String imgLink = article.getImgLink();

    StringBuffer sb = new StringBuffer();
    sb.append(BOLD_OPEN).append(title).append(BOLD_CLOSE);
    sb.append(BREAK);
    sb.append(description);
    sb.append(BREAK);
    sb.append(SMALL_OPEN).append(ITALIC_OPEN).append(date).append(ITALIC_CLOSE).append(SMALL_CLOSE);

    current.put("text", Html.fromHtml(sb.toString()));
    current.put("imageLink", imgLink);
}
}

这是我的RSSHandler.java代码

package com.tmm.android.rssreader.util;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;


public class RSSHandler extends DefaultHandler {

// Feed and Article objects to use for temporary storage
private Article currentArticle = new Article();
private List<Article> articleList = new ArrayList<Article>();

// Number of articles added so far
private int articlesAdded = 0;

// Number of articles to download
private static final int ARTICLES_LIMIT = 20;

//Current characters being accumulated
StringBuffer chars = new StringBuffer();


/* 
 * This method is called everytime a start element is found (an opening XML marker)
 * here we always reset the characters StringBuffer as we are only currently interested
 * in the the text values stored at leaf nodes
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
 */
public void startElement(String uri, String localName, String qName, Attributes atts) {
    chars = new StringBuffer();
}



/* 
 * This method is called everytime an end element is found (a closing XML marker)
 * here we check what element is being closed, if it is a relevant leaf node that we are
 * checking, such as Title, then we get the characters we have accumulated in the StringBuffer
 * and set the current Article's title to the value
 * 
 * If this is closing the "Item", it means it is the end of the article, so we add that to the list
 * and then reset our Article object for the next one on the stream
 * 
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
 */
public void endElement(String uri, String localName, String qName) throws SAXException {

    if (localName.equalsIgnoreCase("title"))
    {
        Log.d("LOGGING RSS XML", "Setting article title: " + chars.toString());
        currentArticle.setTitle(chars.toString());

    }
    else if (localName.equalsIgnoreCase("description"))
    {
        Log.d("LOGGING RSS XML", "Setting article description: " + chars.toString());
        currentArticle.setDescription(chars.toString());
    }
    else if (localName.equalsIgnoreCase("pubDate"))
    {
        Log.d("LOGGING RSS XML", "Setting article published date: " + chars.toString());
        currentArticle.setPubDate(chars.toString());
    }
    else if (localName.equalsIgnoreCase("encoded"))
    {
        Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString());
        currentArticle.setEncodedContent(chars.toString());
    }
    //////////////////
    else if(localName.equalsIgnoreCase("fh:FlightHistory"))
    {
        Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString());
        currentArticle.setFhFlightHistory(chars.toString());
    }
    else if(localName.equalsIgnoreCase("fh:Airline"))
    {
        Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString());
        currentArticle.setFhAirline(chars.toString());
    }
    ////////////////////
    else if (localName.equalsIgnoreCase("item"))
    {

    }
    else if (localName.equalsIgnoreCase("link"))
    {

        try {
            System.out.println(chars.toString());
            Log.d("LOGGING RSS XML", "Setting article link url: " + chars.toString());
            currentArticle.setUrl(new URL(chars.toString()));
        } catch (MalformedURLException e) {
            Log.e("RSA Error", e.getMessage());
            e.printStackTrace();
        }

    }




    // Check if looking for article, and if article is complete
    if (localName.equalsIgnoreCase("item")) {

        articleList.add(currentArticle);

        currentArticle = new Article();

        // Lets check if we've hit our limit on number of articles
        articlesAdded++;
        if (articlesAdded >= ARTICLES_LIMIT)
        {
            throw new SAXException();
        }
    }
}





/* 
 * This method is called when characters are found in between XML markers, however, there is no
 * guarante that this will be called at the end of the node, or that it will be called only once
 * , so we just accumulate these and then deal with them in endElement() to be sure we have all the
 * text
 * 
 * (non-Javadoc)
 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
 */
public void characters(char ch[], int start, int length) {
    chars.append(new String(ch, start, length));
}





/**
 * This is the entry point to the parser and creates the feed to be parsed
 * 
 * @param feedUrl
 * @return
 */
public List<Article> getLatestArticles(String feedUrl) {
    URL url = null;
    try {

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        url = new URL(feedUrl);

        xr.setContentHandler(this);
        xr.parse(new InputSource(url.openStream()));


    } catch (IOException e) {
        Log.e("RSS Handler IO", e.getMessage() + " >> " + e.toString());
    } catch (SAXException e) {
        Log.e("RSS Handler SAX", e.toString());
    } catch (ParserConfigurationException e) {
        Log.e("RSS Handler Parser Config", e.toString());
    }

    return articleList;
}

}

请,任何答案和建议将非常感谢。 :)

1 个答案:

答案 0 :(得分:0)

很可能是与用户代理相关的问题。

据我所知,您呼叫的网站有一个特殊版本的移动设备,如果检测到您使用的是移动用户代理,则不会为您提供RSS提要。

您可能需要更改它。

相关问题