首先需要分析网易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. 计算机毕业设计Android新闻RSS阅读器客户端app(源码+系统+mysql数据库+Lw文档)

    项目介绍 基于Google Android 平台的新闻阅读器的开发过程.首先根据Google android market上面的数据,对给予Google android 移动平台的新闻阅读器进行了需求 ...

  2. Feeder 一款 Mac 上的 RSS 阅读器,更优雅地跟踪最新的新闻和博客文章

    Feeder 一款 Mac 上的 RSS 阅读器,更优雅地跟踪最新的新闻和博客文章 Feeder 是一款 Mac 上的 RSS 阅读器,它可以帮助用户轻松地订阅和管理 RSS 源,让用户可以轻松地跟踪 ...

  3. Web版RSS阅读器(四)——定制自己的Rss解析库myrsslib4j

    在上篇博文<Web版RSS阅读器(三)--解析在线Rss订阅>中,已经提到了遇到的问题,这里再详细说一下. 在解析rss格式的订阅时,遇到的最主要的问题是,出现了"Server ...

  4. Swift 学习之Using Swift mix and match, network: 写rss阅读器

    这里面使用到第三方库,因此需要使用mix and match特性. 请大家指出其中的错误,谢谢! rss 阅读器,很简单的代码,只是为了学习Swift语言而写. 1、BaseViewControlle ...

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

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

  6. 用JSP实现基于Web的RSS阅读器

    2019独角兽企业重金招聘Python工程师标准>>> 一 RSS介绍 根据维基百科(http://zh.wikipedia.org/wiki/RSS)的定义,"RSS是一 ...

  7. Android开发RSS阅读器

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

  8. rss阅读器保存html文件,4款在线RSS阅读器使用体验

    RSS阅读有以下优点:您可以看到没有广告和图片的标题或文章的概要阅读,这样你不必阅读全文即可知文章讲的一个意思是什么,为您节省时间. RSS阅读器会自动更新你定制的网站内容,保持新闻的及时性.要订阅新 ...

  9. RSS阅读器简单介绍

    这篇不是编程技术文章. 预计网站的初期推广将会较多的使用RSS,又由于现在RSS阅读器的普及率不高,而我也有朋友只听说RSS阅读器好却不清楚怎么使用的,所以就写这个了. 关于RSS的定义,需要看这篇文 ...

最新文章

  1. 【蓝桥java】进制与整除之尼姆堆
  2. Jvm面试题及答案 100道(持续更新)
  3. PHP7天前的时间戳
  4. Java线程详解(1)-概念与原理
  5. elementui树形复选框_Element-ui表格树形控件结合复选框实践
  6. Scrum方法论(四)
  7. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
  8. android java框架_【阿里P8大牛教你Android入门之路(java篇)】——Java集合框架(系列篇1)...
  9. Android工具栏中心标题和自定义字体
  10. ❤️六万字《SpringMVC框架介绍—从入门到高级》(建议收藏)❤️
  11. 个人成长(学习方法)
  12. 思思的美食笔记--吃哒【自用---随缘更】
  13. java堆栈总结、JVM
  14. Warmup 模型训练之标配
  15. CStdioFile类学习
  16. qq分享提示设备未授权_友盟微信、QQ等分享提示未验证应用配置
  17. python练习6.16
  18. unimrcp 实现阿里云的plugin
  19. 百度全景图片展示-20130908
  20. 再来 20 个免费的 Bootstrap 的后台管理模板

热门文章

  1. 高斯消元法、列主元高斯消去法、全主元高斯消去法Python实现
  2. Spring Boot整合thymeleaf异常 —— 无法通过th:text=“${xxx}“取到值的解决方法
  3. python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程
  4. 汉文SEO大牛教你如何创建网站地图-seo必修课
  5. C语言有三名同学,每人四门课程,利用指针,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩。
  6. Infa报错ORA-01891: Datetime/Interval internal error
  7. Windows驱动开发第10课(R3与R0通信交换数据第一节)
  8. top1错误率、top5正确率
  9. PyTorch安装最全流程
  10. Practical oral English