首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android rss源阅读器错误(重定向次数过多)

android rss源阅读器错误(重定向次数过多)
EN

Stack Overflow用户
提问于 2012-01-13 18:30:35
回答 1查看 775关注 0票数 0

嘿伙计们。我在Android编程方面是个新手。我正在尝试从一个网站获取RSS提要,使用我从互联网上获得的教程。但是,当我将URL更改为所需的网站id时,程序将不会显示任何内容,并出现以下错误。

代码语言:javascript
复制
01-13 17:09:30.251: ERROR/RSS Handler IO(277): Too many redirects >> java.net.ProtocolException: Too many redirects

这是我的RSSReader.java页面

代码语言:javascript
复制
/**
* 
*/
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代码

代码语言:javascript
复制
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;
}

}

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

EN

回答 1

Stack Overflow用户

发布于 2012-01-13 18:40:00

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

据我所知,你正在呼叫的网站有一个特别的手机版本,如果它检测到你正在使用移动用户代理,就不会给你RSS提要。

您可能需要更改它。

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

https://stackoverflow.com/questions/8849098

复制
相关文章

相似问题

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