最近无意间了解到了rss,简单了解后觉得挺简单,参考了点资料写了个简单的Android版阅读器
我试了试对常见的一些rss新闻以.xml结尾的有效其他无效,以后有时间在研究一下。
效果图;



具体如下;
获取rss数据信息
package com.rss.data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import android.util.Log;
public class RSSFeed {
private String title = null;//新闻标题
private String pubdate = null;//发布时间
private int itemcount = 0;//数量
private List<RSSItem> itemlist = new Vector();//存放所有新闻
public int addItem(RSSItem item)
{
itemlist.add(item);
itemcount++;
return itemcount;
}
public RSSItem getItem(int location)
{
return itemlist.get(location);
}
public List getAllItems()
{
return itemlist;
}
public List getAllItemsForListView(){Log.e("msg", "item size= "+itemlist.size());
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
int size = itemlist.size();
for(int i=0;i<size;i++){
HashMap<String, Object> item = new HashMap<String, Object>();
item.put(RSSItem.TITLE, itemlist.get(i).getTitle());
item.put(RSSItem.PUBDATE, itemlist.get(i).getPubDate());
data.add(item);
}
return data;
}
int getItemCount()
{
return itemcount;
}
public void setTitle(String title)
{
this.title = title;
}
public void setPubDate(String pubdate)
{
this.pubdate = pubdate;
}
public String getTitle()
{
return title;
}
public String getPubDate()
{
return pubdate;
}
}
将信息封装成消息类
package com.rss.data;
public class RSSItem {
public static final String TITLE="title";//两个常量用于显示在listview上的
public static final String PUBDATE="pubdate";
private String title = null; //新闻标题
private String link = null; //新闻链接
private String pubdate = null; //新闻发布时间
private String description = null; //新闻描述
private String category = null; //新闻类别
public void setTitle(String title)
{
this.title = title;
}
public void setDescription(String description)
{
this.description = description;
}
public void setLink(String link)
{
this.link = link;
}
public void setCategory(String category)
{
this.category = category;
}
public void setPubDate(String pubdate)
{
this.pubdate = pubdate;
}
public String getTitle()
{
return title;
}
public String getDescription()
{
return description;
}
public String getLink()
{
return link;
}
public String getCategory()
{
return category;
}
public String getPubDate()
{
return pubdate;
}
@Override
public String toString()
{
if (title.length() > 20)
{
return title.substring(0, 42) + "...";
}
return title;
}
}
解析rss数据信息;
package com.rss.parse;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
import com.rss.data.RSSFeed;
import com.rss.data.RSSItem;
public class RSSHandler extends DefaultHandler {
RSSFeed rssFeed;
RSSItem rssItem;
final String ITEM_TITLE="title";
final String ITEM_item="item";
final String ITEM_link="link";
final String ITEM_description="description";
final String ITEM_data="pubDate";
final String ITEM_category="category";
final String ITEM_channel="channel";
final int RSS_TITLE = 1;
final int RSS_LINK = 2;
final int RSS_DESCRIPTION = 3;
final int RSS_CATEGORY = 4;
final int RSS_PUBDATE = 5;
int currentstate = 0;
StringBuffer theString;
public RSSHandler(){
rssFeed = new RSSFeed();
rssItem = new RSSItem();
}
public RSSFeed getFeed(){
return rssFeed;
}
@Override
public void startDocument() throws SAXException{
super.startDocument();
}
@Override
public void endDocument() throws SAXException{
super.endDocument();
}
@Override
public void startElement(String uri, String localName,String qName, Attributes atts) throws SAXException{
super.startElement(uri, localName, qName, atts);
theString = new StringBuffer();
if (localName.equals(ITEM_channel))
{
currentstate = 0;
return;
}
if (localName.equals(ITEM_item))
{
rssItem = new RSSItem();
return;
}
if (localName.equals(ITEM_TITLE))
{
currentstate = RSS_TITLE;
return;
}
if (localName.equals(ITEM_description))
{
currentstate = RSS_DESCRIPTION;
return;
}
if (localName.equals(ITEM_link))
{
currentstate = RSS_LINK;
return;
}
if (localName.equals(ITEM_category))
{
currentstate = RSS_CATEGORY;
return;
}
if (localName.equals(ITEM_data))
{
currentstate = RSS_PUBDATE;
return;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException{
super.endElement(namespaceURI, localName, qName);
switch (currentstate){
case RSS_TITLE:
rssItem.setTitle(theString.toString());
break;
case RSS_LINK:
rssItem.setLink(theString.toString());
break;
case RSS_DESCRIPTION:
rssItem.setDescription(theString.toString());
break;
case RSS_CATEGORY:
rssItem.setCategory(theString.toString());
break;
case RSS_PUBDATE:
rssItem.setPubDate(theString.toString());
break;
default:
break;
}
currentstate = 0;
//如果解析一个item节点结束,就将rssItem添加到rssFeed中。
if (localName.equals(ITEM_item))
{
rssFeed.addItem(rssItem);
return;
}
}
@Override
public void characters(char ch[], int start, int length){
// String theString = new String(ch,start,length);
try {
super.characters(ch, start, length);
} catch (SAXException e) {
e.printStackTrace();
}
theString.append(ch, start, length);
}
}
数据显示Activity;
package com.rss.win;
import java.io.IOException;
import java.net.URL;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.rss.data.RSSFeed;
import com.rss.data.RSSItem;
import com.rss.parse.RSSHandler;
public class RssReadActivity extends Activity implements OnItemClickListener {
String RSS_URL ="http://www.xinhuanet.com/world/news_world.xml";
public final String tag = "RSSReader";
private RSSFeed feed = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
feed = getFeed(RSS_URL);
showListView();
}
private RSSFeed getFeed(String urlString) {
try {
URL url = new URL(urlString);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RSSHandler rssHandler = new RSSHandler();
xmlreader.setContentHandler(rssHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return rssHandler.getFeed();
} catch(IOException e){
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return null;
}
private void showListView() {
ListView itemlist = (ListView) findViewById(R.id.itemlist);
if (feed == null) {
setTitle("访问的RSS无效");
return;
}
SimpleAdapter adapter = new SimpleAdapter(this,
feed.getAllItemsForListView(),
android.R.layout.simple_list_item_2, new String[] {
RSSItem.TITLE, RSSItem.PUBDATE }, new int[] {
android.R.id.text1, android.R.id.text2 });
itemlist.setAdapter(adapter);
itemlist.setOnItemClickListener(this);
itemlist.setSelection(0);
}
@Override
public void onItemClick(AdapterView parent, View v, int position, long id) {
Intent itemintent = new Intent(this, ShownDescrition.class);
Bundle b = new Bundle();
b.putString("title", feed.getItem(position).getTitle());
b.putString("description", feed.getItem(position).getDescription());
b.putString("link", feed.getItem(position).getLink());
b.putString("pubdate", feed.getItem(position).getPubDate());
itemintent.putExtra("android.intent.extra.rssItem", b);
startActivityForResult(itemintent, 0);
}
}
package com.rss.win;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ShownDescrition extends Activity {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.showdescription);
String content = null;
Intent startingIntent = getIntent();
if (startingIntent != null) {
Bundle bundle = startingIntent
.getBundleExtra("android.intent.extra.rssItem");
if (bundle == null) {
content = "app have a error";
} else {
content = bundle.getString("title") + "\n\n"
+ bundle.getString("description")+ "\n\n"
+ bundle.getString("pubdate") + "\n\n"
+ "\n\n详细信息请访问以下网址:\n" + bundle.getString("link");
}
} else {
content = "app have a error";
}
TextView textView = (TextView) findViewById(R.id.content);
textView.setText(content);
Button backbutton = (Button) findViewById(R.id.back);
backbutton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
布局文件 main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/itemlist"
/>
</LinearLayout>
布局文件 showdescription.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:autoLink="all"
android:text=""
android:id="@+id/content"
android:layout_weight="1.0"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="返回"
android:id="@+id/back"
/>
</LinearLayout>
最后添加网络权限;
<uses-permission android:name = "android.permission.INTERNET"/>