首先需要分析网易RSS订阅中心的网页布局情况。

网易RSS订阅中心:http://www.163.com/rss/

你会发现RSS文件由一个<channel>元素及其子元素组成,除了频道本身内容之外,<channel>还以项的形式包含表示频道元数据的元素。

其中频道下面主要的三个元素就是:

1.title:频道或提要的名称。

2.link:与该频道关联的WEB站点或者站点区域的URL。

3.description:简要介绍该频道是做什么的。

当然还有其他子元素是可选的,比如常用的有<image>,<language>,<copyright><pubDate>等.

下面我们编写的RSS阅读器是包含了四个元素,有titile,link,description,pubDate.

首先:我们创建新闻的实体类:

package com.example.rssview;

public class News {
private String title;//新闻标题
private String link;//新闻网址
private String description;//新闻描述
private String pubDate;//新闻发布时间

public News() {
}

public News(String title, String link, String description, String pubDate) {
this.title = title;
this.link = link;
this.description = description;
this.pubDate = pubDate;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getLink() {
return link;
}

public void setLink(String link) {
this.link = link;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getPubDate() {
return pubDate;
}

public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}

}

上面是程序开发的第一步,完成实体类的创建

第二步:我们应该也可想而知,必须解析XML的有用数据,常用的解析XML的方法有三种:DOM解析,SAX解析,PULL解析

因为DOM解析必须读取所有的XML内容到内存里面,挺耗系统资源的所以,我推荐选择SAX解析,或者PULL解析。

这里我选择SAX解析方法具体代码如下:

package com.example.rssview;

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

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

import android.util.Log;

public class SAXParserHelper extends DefaultHandler {
private List<News> newsList;//保存解析的所有新闻数据
private News news;//单个新闻内容
private String nodeName;//判断是那个元素用

//获取所有新闻数据
public List<News> getNewsList() {
return newsList;
}

//开始解析XML文档
@Override
public void startDocument() throws SAXException {
newsList = new ArrayList<News>();
}

//结束解析XML文档
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}

//开始解析某个元素
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (localName.equals("title")) {
news = new News();
}
this.nodeName = localName;
}

//结束解析某个元素
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (localName.equals("item")) {
newsList.add(news);
// Log.i("SAXParserHelper", news.getTitle());
// Log.i("SAXParserHelper", news.getLink());
// Log.i("SAXParserHelper", news.getPubDate());
// Log.i("SAXParserHelper", news.getDescription());
}
}

//解析元素的文本内容
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {

if ("title".equals(this.nodeName)) {
news.setTitle(String.valueOf(ch, start, length));
} else if ("link".equals(this.nodeName)) {
news.setLink(String.valueOf(ch, start, length));
} else if ("description".equals(this.nodeName)) {
news.setDescription(String.valueOf(ch, start, length));
} else if ("pubDate".equals(this.nodeName)) {
news.setPubDate(String.valueOf(ch, start, length));
}
}

}

代码就不用多解释了,相信备注已经些的非常的详细了,也提供了供外部获取解析数据的方法getNewsList();

第三步:当然是去Activity活动里面去编写主要的代码了

开始我们必须准备包含了listView控件的布局文件,然后在activity里面设置布局文件

当然你也可以直接继承ListActivity类,这样更方便编程

你也应该知道这是从网络读取网址获取XML数据,根据Android的编程原则,耗时的网络操作不应该在主线程中直接执行,因为这样会造成主线程的崩溃。

然而android给我们提供了一个异步处理的机制类AsyncTask只要自己写个类实现该类把耗时的任务放在doInBackground方法里面处理就可以了。

当我们获得网络数据后就会操作更新UI来显示解析的XML数据,这个时候就可以在AsyncTask的onPostExecute里面解决.

也许我们还应该分析一下AsyncTask的三个参数,第一个参数是传递进来的参数,比如我们下面会传入一个网址供AsyncTask解析获得XML数据,第二个参数就是进度显示单位我们常常设置为Integer,第三个参数就是doInBackground方法返回的数据供onPostExecute调用的数据,也就是onPostExecute的参数.

下面我们首先必须获得网络的XML。

URL url = null;//创建URL对象
String XmlSourceStr = null;//解析后的XML数据
try {
url = new URL(params[0]);//获取传递进来的网址资源
if (url != null) {
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();//打开链接
InputStreamReader isReader = new InputStreamReader(
conn.getInputStream(), "UTF-8");//读取数据到InputStreamReader对象中,并设置编码格式为UTF-8
BufferedReader br = new BufferedReader(isReader);//实例化bufferedReader
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);//读取XML数据到StringBuilder中
}
isReader.close();//关闭数据流
conn.disconnect();//关闭连接
XmlSourceStr = sb.toString();//读取StringBuilder数据到字符串中
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return XmlSourceStr;//返回解析的XML字符串数据

这个方法属于网络处理比较耗时,相信大家也就知道,应该写在doInBackground中

获取网络的XML数据后,下面就是解析XML的数据,上面已经提到过。我们使用的解析方式是SAX解析。代码如下:

SAXParserFactory factory = SAXParserFactory.newInstance();//创建SAXParserFactory实例
if (result != null) {
try {
SAXParser parser = factory.newSAXParser();//新建SAXParser解析类
XMLReader xmlReader = parser.getXMLReader();//创建XMLReader读取类
SAXParserHelper helper = new SAXParserHelper();//实例化SAX解析方法
xmlReader.setContentHandler(helper);//设置处理器
xmlReader.parse(new InputSource(new StringReader(result)));//读取需要处理的数据
newsList = helper.getNewsList();//获得处理的结果
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

上面的操作不属于网络因为灯会需要操作更新UI,所以代码写在onPostExecute中

下面我们用迭代器遍历处理的结果,当然需要判断获取了需要的结果没有,代码如下:

if (!newsList.isEmpty()) 
Iterator<News> it = newsList.iterator();

然后创建一个用于接受遍历结果的Map类 Map<String,Object> map=new HashMap<String,Object>();

而simpleAdapter的构造方法中接收的是一个List对象,而上面获取的每个map,也就只是单独的一个新闻,所以必须创建List<Map<String,Object>> newsList=new ArrayList<Map<String,Object>>();将每一条map新闻保存在newsList当中.

对于刚才说的simpleAdapter一般有一点android基础的应该都不陌生,没错他就是简单的适配器.等会将数据显示到listView上面可少不了他。

现在我们就来设置listView显示新闻,代码如下:

首先绑定listView界面

SimpleAdapter adapter=new SimpleAdapter(Context,list对象,布局文件,listView中数据项,listView中数据项对应的ID);

第一个参数并不陌生就是上下文了,简单说就是继承活动的类名.this。

第二个参数属于刚才获取所有新闻的newsList.

第三个参数就是listView要显示的布局文件样式R.layout.你的布局文件名.

第四个参数就是map.put方法中前面字符串的名称.

第五个参数就是第三个参数布局文件中用于显示新闻每个项的ID;

最后设置到listView中就可以了,具体代码如下:

if (!newsList.isEmpty()) {
Iterator<News> it = newsList.iterator();
while (it.hasNext()) {
News news = (News) it.next();
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("title", news.getTitle());
map.put("pubDate", news.getPubDate());
Log.i("MainActivity", news.getTitle());
Log.i("MainActivity", news.getPubDate());
mData.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,
mData, R.layout.list_item, new String[] { "title",
"pubDate" }, new int[] { R.id.title,
R.id.pubDate });
newsListView.setAdapter(adapter);
}

当然这里我并没有做显示新闻详细的内容显示功能,不过相信看懂上面的代码后,你们也知道设置显示新闻相信内容和获取上面的代码有异曲同工之妙了。

好了,简单的RSS阅读器就讲到这样。我的第一篇博文,虽然不尽完美,但也算是讲解程序的一个起点。

网易新闻RSS阅读器的更多相关文章

  1. Web版RSS阅读器(三)——解析在线Rss订阅

    上篇博客<Web版RSS阅读器(二)——使用dTree树形加载rss订阅分组列表>已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资 ...

  2. RSS阅读器

    RSS阅读器(Really Simple Syndication)是一种软件/程序,实质都是为了方便地读取RSS和Atom文档.大概就是实现了订阅式阅读,推送用户感兴趣的新闻,博客等(比如等某位博主更 ...

  3. RSS阅读器python实现概述

    这边简单说一下最近倒腾的RSS阅读器的小东东,RSS阅读器估计很多人用过或者自己动手实现过.首先wudagang0123多年前提供的一个示例:http://bbs.chinaunix.net/foru ...

  4. RSS阅读器&BT sync

    ①RSS阅读器? 答:RSS阅读器是一种软件或是说一个程序,这种软件可以自由读取RSS和Atom两种规范格式的文档,且这种读取RSS和Atom文档的软件有多个版本,由不同的人或公司开发,有着不同的名字 ...

  5. 为什么说Thunderbird是最好的桌面RSS阅读器

    也许现在再讨论RSS阅读器似乎已经过时了,毕竟随着社交网络服务的发展,通过一个带有大众评分能力的社交网络(比如reddit),相比RSS的固定订阅而言,也许你能更快地在你所关心的话题上更快地获得新的资 ...

  6. 基于JSP的RSS阅读器的设计与实现

    阅读器访问地址:http://easyrss.tk/,欢迎体验! 阅读导览 一.    概述  二.    设计的基本概念和原理 三.    设计方案 四.    主要源代码 五.    阅读器使用说 ...

  7. C#版简易RSS阅读器

    C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collection ...

  8. [UWP]涨姿势UWP源码——极简的RSS阅读器

    涨姿势UWP,一个开源的RSS阅读器,一个纯粹的项目,一个有道德的APP,一个脱离了低级趣味的作者,一些有益于人民的代码.骚年,还等什么,来涨点姿势吧! 该项目代码可能会引起部分人群的不适,敏感人群请 ...

  9. Tiny Rss Reader - 迷你RSS阅读器

    发布新软件 TinyRss: Windows平台上的一个小巧的Rss阅读器. 用户界面: 项目地址: https://github.com/movsb/tinyrss.git 测试下载: http:/ ...

随机推荐

  1. SimpleUrlHandlerMapping用法

    SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系.有两种方式声明SimpleUrlH ...

  2. PHP- Windows无法在本地计算机启动Apache的解决方法

    装好了WAMP,开始可以进行我的PHP学习了.可是装后却打不开locahost. 百度后如下解决了:"Windows不能在本地计算机启动Apache2.有关更多信息,查阅系统事件日志.如果这 ...

  3. socket断开连接的四次握手及常见过程解析

    TCP的协议文档对TCP的一些规定:文档名称-RFC793  TCP消息头的控制位 URG:紧急指针字段有效 ACK:确认头部字段有效 PSH:强制函数 RST:重置链接 SYN:同步系列号码 FIN ...

  4. c# Internet时间服务器同步

    2009-02-02 17:48 8226人阅读 评论(2) 收藏 举报 服务器internetc#socketstringwindows 需要用到的名空间 using System.Net; usi ...

  5. Python3学习

    要做一个儿童搜索引擎的项目(www.kidsearch.cn),所以开始接触各种新的语言,初步学了PHP爬虫,觉得要做大点的项目用PHP确实不太方便,中文兼容性就是一个比较棘手的问题.python的爬 ...

  6. 如何知道PostgreSQL数据库下每个数据库所对应的目录

    base目录,这是所有数据库目录的父目录. 在base目录下第一层,每个目录就是一个数据库所对应的文件. 那么如何知道哪个目录对应哪个数据呢? 查询如下:先看数据库列表 [pgsql@localhos ...

  7. c# 反射学习笔记

    首先了解C#反射的概念,反射是一个运行库类型发现的过程.通过反射可以得到一个给定程序集所包含的所有类型的列表, 这个列表包括给定类型中定义的方法.字段.属性和事件.也可以动态的发现一组给定类支持的借口 ...

  8. HDU 1863 畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  9. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  10. [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)

    前言 在 [Ext JS 4] 实战之 带week(星期)的日期选择控件(二) 的最后,有提到一个解决方案. 不过这方案有一个条件  ==> “2. 每年的周数从(1-52), 如果超过52 周 ...