产品名称 |
产品版本 |
|
Keyword: RssReader RssFeed Channel j2me midp midlet kxml xmlpull RMS RssOwl java |
RSS无线阅读器 |
0.7.1729 |
[J2ME][开源]RSSOwlMidlet
(RSS无线阅读器)
设计说明
我的RssReader资源:
1:《[J2ME]RSSOwlMidlet(RSS无线阅读器)开源说明》
2:《[J2ME]RSSOwlMidlet(RSS无线阅读器)设计说明》
3:下载源代码:http://www.cnblogs.com/Files/zhengyun_ustc/RSSOwlMidlet-src.rar
4:下载midlet:jad: RSSOwlMidlet.jad jar: RSSOwlMidlet.jar (jar包可能有点偏大,您可以进行混淆来缩小)
本文档给出RSS无线阅读器J2ME版本的设计思路和类说明。
第1章 简单描述RSS无线阅读器J2ME版本的背景、功能和特别之处。
第2章 描述调用RSS无线阅读器J2ME版本的设计思路。
第3章 给出了 RSS无线阅读器J2ME版本的设计过程中需要特别指出的问题。
第4章 给出了 各种下载资源。
摘要:本章 简单描述RSS无线阅读器J2ME版本的背景、功能和特别之处。
我们提供的RSS无线阅读器J2ME版本[开源]是一个可以下载到手机(例如Nokia7610)或者其他无线手持设备(例如PocketPC)的应用程序,用来阅读存在于Internet中广泛的RSS新闻源,比如
豆瓣最新评论 http://www.douban.com/feed/review/latest;
博客堂 http://blog.joycode.com/MainFeed.aspx;
博客园 http://www.cnblogs.com/rss.aspx;
CSDN技术文档 http://www.csdn.net/Rss/RssFeed.aspx?rssid=3;
ChinaUnix.net-业界新闻与评论 http://bbs.chinaunix.net/rss/46.xml;
keso's blog http://feeds.feedburner.com/PlayinWithIt
等等,这些新闻源我们将预置在本应用程序中。
下面介绍RSS无线阅读器的功能列表:
l RSS Feed列表
n 添加Rss Feed
n 编辑Rss Feed
n 删除Rss Feed
l 读取Rss Feed新闻
n 查看新闻摘要
l 重新读取Rss Feed新闻
l 关于我
这里简单介绍一下RSS,它并不是一个新概念,从大约2002年就已经通行天下了,最通常的是Blog的RSS输出,当然许多其他类型的站点也都提供了本站内容的RSS输出格式,比如:
论坛帖子,比如“ChinaUnix.net”;
新闻站点,比如“百度新闻”或者“Google新闻”;
门户,比如“新浪体育”,等等。
RSS其实就是特定格式的XML。所以在J2ME解决方案中,就是通过HttpConnection获取RSS XML文档并解析,将新闻条目显示在界面上,说起来很简单的。
下面,我们说说这个应用程序的特别之处。
这个应用程序的思路来自于两个开源的应用程序:
How to create a J2ME MIDP RSS Reader application with NetBeans 4.0 作者 Tommi Laukkanen
J2ME手机电话本 作者 garrey
RSS读取以及用xmlpull解析这部分思路,采用了Tommi 的思路;
MVC的类分解,以及对RMS记录存储的封装模式,采用了 garrey 的思路。
对于获取RMS中存储的所有的Rss Feed列表,采用了文章《探索J2ME:对记录进行排序》的代码,放弃了garrey的RecordComparator比较器的实现。
另外,在调试过程中,也加入了我的一些思考,以及兼容各种RSS的办法。
总结一下特别之处。
特别是比原来Tommi 的版本增加了几个特性:
l 最大的改动就是,原来Tommi把视图/控制器都放在RssReaderMIDlet.java了,而我们将视图分拆出来为RssFeedAdd.java、RssFeedEdit.java、RssFeedList.java等等,控制器则为GUIController.java;
l 可以添加/编辑/删除Rss Feed书签;
l 原来Tommi将Feed列表以及URL存储在RMS的一个条目,我放弃了这种做法,而是像garrey处理电话记录一样;
l 当请求远端服务器时,加入了动画等候画面,提示用户正在获取新闻列表;
l 由于采用了xmlpull方式解析XML,所以可以做到一边后台扫描XML文档,一边前台将解析到的新闻Title显示在用户界面上,不影响用户阅读新闻列表;
l 兼容博客堂/博客园这种.Text类型Blog的RSS,因为它们限制请求方的“User-Agent”;
l 采用KxmlParser的自动检测RSS XML文档的编码格式,所以不用用户专门设置编码格式。
摘要:本章描述RSS无线阅读器J2ME版本的设计思路。
关键三个包:
l javax.microedition.io. HttpConnection;
l org.kxml2.io. KXmlParser;
l org.xmlpull.v1.*。
HttpConnection:
下面来看看如何用HttpConnection类来请求远端的RSS服务器并获取RSS XML数据。
第一步是使用Connector类打开一个到服务器的连接,我们将把这个连接强制转换为需要的HttpConnection类型。
代码 |
HttpConnection hc = null; hc = (HttpConnection) Connector.open( url ); hc.setRequestMethod(HttpConnection.GET); |
接下来,我们得到HttpConnection上的一个InputStream,允许我们一个字符一个字符的读取服务器的响应数据。
代码 |
parseRssFeedXml( hc.openInputStream() );
public void parseRssFeedXml(InputStream is); |
org.kxml2.io. KxmlParser:
parseRssFeedXml函数就是负责用KXmlParser来解析这响应数据。
kxml2官方站点:http://kxml.sourceforge.net/。
下载kxml2代码:http://sourceforge.net/project/showfiles.php?group_id=9157&package_id=58653。
Enhydra的KXML是一个被设计用于J2ME设备的只占很小存储空间的XML语法分析程序,虽然它也可以被用于其它需要小型XML语法分析程序的环境,比如Applet。KXML支持以下特性:
1、支持XML名称空间;
2、用"松散"模式分析HTML或其它SGML格式;
3、占用很少的存储空间(21 kbps;
4、基于Pull的分析;
5、支持XML写操作;
6、可选的DOM支持;
7、可选的WAP支持。
KXML支持DOM语法分析和操作,但是不支持push语法分析。取而代之,它使用一种稍微不同的称为“Pull”的分析方法。与push语法分析相反,Pull语法分析让程序员从语法分析程序中“拉”出下一个事件。
Xmlpull官方站点:http://www.xmlpull.org/
优点:不必等整个文档解析完成,部分求值结果早就可以开始反馈给用户。
下面我们看看KXML如何做一个Pull语法分析程序。
首先我们需要创建了一个XmlParser,并把它传到一个InputStream中。
代码 |
public void parseRssFeedXml(InputStream is) throws IOException, XmlPullParserException { KXmlParser parser = new KXmlParser(); parser.setInput( is, null); // 设置null让KXmlParser自动检测该使用哪种编码 |
其次,我们需要跳过RSS根节点的“rss”之类的东西。
代码 |
parser.nextTag(); parser.require(parser.START_TAG, null, null); |
下面,我们来寻找RSS中的第一个“item”节点,它代表这个RSS文档中确实包含了新闻条目。这是通过下面的循环做到的。parser.next()的含义是“Get next parsing event”,这样就可以遍历文档,如果找不到item节点,就抛出一个异常。
代码 |
while(!"item".equals(parser.getName()) ){ /** Check if document doesn't include any item tags */ if( parser.next() == parser.END_DOCUMENT ) throw new IOException("No items in RSS feed!"); } |
确认有item节点后,我们来寻找RSS中代表每一个新闻的“item”节点下的三个节点“title”“link”“description”,这是通过下面的循环做到的。parser.next()的含义是“Call next() event if it is START_TAG or END_TAG otherwise throw an exception”,这样就可以遍历文档找全所有的新闻的主题、链接和摘要了。
代码 |
/** Parse <item> tags */<p></p></item> do { parser.require(parser.START_TAG, null, null);
/** Initialize properties */ title = ""; description = ""; link = "";
/** One <item&g 发表评论
最新评论
|
评论