首先需要分析网易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. C++中不常用关键字

    mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员.我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会 ...

  2. MFC拆分窗口及它们之间的数据交换(转)

    转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...

  3. APK的目录结构

    APK 包含以下内容: 被编译的代码文件(.dex文件) 文件资源(resources) assets. 证书(certificates) 清单文件(maifestfile) assets 文件 li ...

  4. 处理get中的中文乱码情况

    1 最基本的乱码问题.这个乱码问题是最简单的乱码问题.一般新会出现.就是页面编码不一致导致的乱码.<%@ page language="java" pageEncoding= ...

  5. oracle连接数据的oci和thin的区别

    1)从使用上来说,oci必须在客户机上安装oracle客户端或才能连接,而thin就不需要,因此从使用上来讲thin还是更加方便,这也是thin比较常见的原因.2)原理上来看,thin是纯java实现 ...

  6. Html+jquery mobile

    打开VS 2013,选择[文件]-[新建]-[项目] 选择框架为.NET Framework4-[ASP.NET MVC4 Web应用程序],点击[确定] 选择[基本],点击[确定] 创建的MVC的项 ...

  7. Codeforces Round #333 (Div. 2) C. The Two Routes flyod

    C. The Two Routes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/602/pro ...

  8. Codeforces Round #327 (Div. 2) E. Three States BFS

    E. Three States Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/probl ...

  9. MRuby 编译笔记

    专注于嵌入式脚本的MRuby在Windows下的编译笔记: 环境: OS: Windows 8.1, 使用 VS Express 2013 for Desktop. 材料: MRuby : 下载源码就 ...

  10. ios开发——面试篇C语言精华

    面试篇C语言精华    1.面向过程:分析解决问题所需要的步骤,然后用函数把这些步骤一步一步实 现. 面向对象:直接描述客观世界的对象及其相互关系.现实世界中任何实体都 可以看作是对象,对象之间通过消 ...