- 浏览: 434241 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
qja:
Iterator.remove()这个方法也会出错的。
java.util.ConcurrentModificationException 出现的原因和解决办法 -
angeli:
List<String> save = new A ...
java.util.ConcurrentModificationException 出现的原因和解决办法 -
大峰子:
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
python学习笔记-Python交互模式下方向键出现乱码 -
anypwx:
牛哥,怎么找到的,解决了我的报错问题,谢谢
JSONObject NestableRuntimeException -
tp7300:
确实好很多了,谢谢博主。
Failed to install on device 'emulator-5554': timeout
前段时间开始接触android,看了一遍android自带的sdk文档,感觉很虚,就自己动手写了个简单的rss阅读器来巩固一下学到的知识。主要功能:
支持用户自定义rss类别和每个类别下的频道。通过添加的频道了解该频道下的最新新闻,内置了很多频道,如:javaeye的各版块,名人博客,英语学习,雅虎新闻,新浪新闻等。
首先要了解什么是RSS,关于这个我前面的文章里有解释,这里就不多说了,主要作用是订阅自己感兴趣的新闻,这样就不用一个网站一个网站的去找了,通过RSS阅读器就可以轻松实现实时更新阅读。一个RSS文件就是一个规范的xml数据文件,该文件一般以rss,xml或者rdf作为后缀。下面是一个RSS2.0文件结构:
以下是RSS 2.0的代码样例 <!-- XML版本和字符集 --> <?xml version="1.0"?> <!-- RSS版本 --> <rss version="2.0"> <!-- 以下为频道信息及新闻列表 --> <channel> <!-- 频道总体信息:开始 --> <!-- 频道标题 --> <title>Lift Off News</title> <!-- 频道链接的总地址 --> <link>http://liftoff.msfc.nasa.gov/</link> <!-- 频道描述文字 --> <description>Liftoff to Space Exploration.</description> <!-- 频道使用的语言(zh-cn表示简体中文) --> <language>en-us</language> <!-- 频道发布的时间 --> <pubDate>Tue, 10 Jun 2003 04:00:00 GMT</pubDate> <!-- 频道最后更新的时间--> <lastBuildDate>Tue, 10 Jun 2003 09:41:01 GMT</lastBuildDate> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <!-- 频道生成器 --> <generator>Weblog Editor 2.0</generator> <managingEditor>editor@example.com</managingEditor> <webMaster>webmaster@example.com</webMaster> <ttl>5</ttl> <!-- 频道总体信息:结束 --> <!-- 每条RSS新闻信息都包含在item节点中, --> <item> <!-- 新闻标题 --> <title>Star City</title> <!-- 新闻链接地址 --> <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link> <!-- 新闻内容简要描述 --> <description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.</description> <!-- 新闻发布时间 --> <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate> <!-- 新闻目录 --> <category>IT</category> <!-- 新闻作者 --> <author>bill</author> <guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid> </item> <item> <title>Space Exploration</title> <link>http://liftoff.msfc.nasa.gov/</link> <description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.</description> Fri, 30 May 2003 11:06:42 GMT</pubDate> <guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid> </item> <item> <title>The Engine That Does More</title> <link>http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp</link> <description>Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that.</description> Tue, 27 May 2003 08:37:32 GMT</pubDate> <guid>http://www.zhanghangfeng.cn/rss.xml</guid> </item> <item> <title>Astronauts' Dirty Laundry</title> <link>http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp</link> <description>Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options.</description> Tue, 20 May 2003 08:56:02 GMT</pubDate> <guid>http://liftoff.msfc.nasa.gov/2003/05/20.html#item570</guid> </item> </channel> </rss>
我主要是获得item下的title、link、pubDate、description的内容,rss阅读器最核心的是解析rss文件,其实就是解析xml文件。现在流行的有三种解析xml的方式,DOM、SAX、Pull。关于DOM和SAX的解析方式完全不同,DOM是基于文档,而SAX是基于事件驱动的,再移动设备上最好是选择SAX方式,网上有很多关于这方面的资料,读者可以自己去查阅,XmlPullParser和SAX原理差不多,但是更简单。这里采用XmlPullParser方式。解析Rss我主要用到三个类,XmlPullParserUtil.java,RSSFeed.java,RSSItem.java,XmlPullParserUtil是解析RSS文件用的,RSSFeed和RSSItem用来存储解析得到的数据。RSSFeed和一个完整的RSS文件相对应,RSSItem和RSS文件里的item标签相对应。
下面是RSSFeed.java的源码
/** * * @author alex *备注:RSSFeed和一个完整的RSS文件相对应 *RSS的描述信息有: *title:标题信息 *link:链接信息 *description:描述信息 */ public class RSSFeed { private String title = null; //新闻标题 private String pubdate = null; public String getPubdate() { return pubdate; } public void setPubdate(String pubdate) { this.pubdate = pubdate; } private int itemCount; //新闻数 private List<RSSItem> itemList; //存放的是所有新闻,一个item标签代表一条新闻 public RSSFeed() { itemList = new ArrayList<RSSItem>(); } /** * 负责把一个RSSItem加入到RSSFeed里面 * @param item * @return */ public int addItem(RSSItem item) { itemList.add(item); itemCount ++; return itemCount; } public RSSItem getItem(int location) { return itemList.get(location); } /** * 返回所有的新闻列表 * @return */ public List<RSSItem> getAllItems() { return itemList; } /** * List<Map<String,Object>>存放着要在ListView显示的数据 * @return */ public List<Map<String,Object>> getAllItemsForListView() { 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; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getItemCount() { return itemCount; } }
下面是RSSItem.java的源码
/** * * @author alex *备注:RSSItem和RSS文件里的item标签相对应 *item包含的信息: *title:标题信息 *link:链接信息 *description:描述信息 *pubDate:发布日期 */ 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 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 getPubDate() { return DateUtil.getSimpleDateFormat(pubDate); //对返回的日期进行格式化,DateUtil是自定义的一个对日期进行格式的类 } public void setPubDate(String pubDate) { this.pubDate = pubDate; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }
下面是XmlPullParser.java的源码
/** * * @author alex *功能:解析读取的RSS文件,并存放到RSSFeed和RSSItem中 */ public class XmlPullParserUtil { public static RSSFeed parseXml(URL url) { RSSFeed rssFeed = new RSSFeed(); RSSItem item = null; try { HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); //通过参数url创建一个http远程连接 urlConnection.connect(); //开启连接 InputStream inputStream = urlConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String str = ""; StringBuffer buffer = new StringBuffer(); while((str = reader.readLine()) != null) { buffer.append(str); //把从网络上读取的数据存进StringBuffer里 } XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); //设置为true,则factory创建的XmlPullParser提供对xml 命名空间的支持 XmlPullParser parser = factory.newPullParser(); parser.setInput(new StringReader(buffer.toString())); //解析读取的xml文件流 parser.nextTag(); //此时解析的标签为rss,parser.nextTag():调用next()方法,并返回该事件是START_TAG 还是 END_TAG parser.nextTag(); //此时解析的标签为channel while(parser.nextTag() == XmlPullParser.START_TAG){ String name1=parser.getName(); //获得该标签的名字 if(name1.equals("item")){ item = new RSSItem(); while(parser.nextTag()==XmlPullParser.START_TAG){ String name2 = parser.getName(); if(name2.equals("title")){ item.setTitle(parser.nextText()); }else if(name2.equals("link")){ item.setLink(parser.nextText()); }else if(name2.equals("description")){ item.setDescription(parser.nextText()); } else if(name2.equals("pubDate")) { item.setPubDate(parser.nextText()); } else{ skipUnknownTag(parser); } } rssFeed.addItem(item); }else{ skipUnknownTag(parser); } } }catch(Exception e) { } return rssFeed; } /** * 标签结束时进行的处理 * @param parser * @throws Exception */ private static void skipUnknownTag(XmlPullParser parser) throws Exception { // 事件为START_DOCUMENT时,parser.next()=0 while (parser.next() > 0) { if (parser.getEventType() == XmlPullParser.END_TAG) break; } } }
以上是该rss阅读器的核心代码,关于android UI的代码由于篇幅就不贴上来了。
通过该项目掌握的知识点:1)RSS的文件结构和含义
2)解析xml文件的几种方式
3)android应用的结构和MVC模式
4)activity的生命周期,activity之间通过intent通信,handler消息机制,自定义ListView,LinearLayout、RelativeLayout、FrameLayout布局界面,WebView显示网页。android数据存储(SQLite3)的相关操作,菜单和对话框、Toast的使用,android的测试驱动,uses-permission权限配置等。
下面是该项目在优亿市场的链接
http://www.eoemarket.com/apps/8323
附件是源码和截图,写的有些乱,请读者见谅
评论
不知道是不是机器是2.1的缘故。
我看了下里面的代码,是不是要拦截代码还要加些东西?
/** * 监听按键事件 */ public boolean onKeyDown(int keyCode, KeyEvent event) { //按下回退键时 if(keyCode == KeyEvent.KEYCODE_BACK) { showDialog(DIALOG5); } return super.onKeyDown(keyCode, event); }
不好意思哦,这个地方当时没注意到,把return super.onKeyDown(keyCode, event); 改成return true;就ok了。
不知道是不是机器是2.1的缘故。
我看了下里面的代码,是不是要拦截代码还要加些东西?
/** * 监听按键事件 */ public boolean onKeyDown(int keyCode, KeyEvent event) { //按下回退键时 if(keyCode == KeyEvent.KEYCODE_BACK) { showDialog(DIALOG5); } return super.onKeyDown(keyCode, event); }
发表评论
-
warning: libfmodex64.so, needed by ../../lib/linux/Debug/libcocosdenshion.so,
2012-03-13 01:20 1981linux环境下用cocos2d-x开发游戏时,遇到了 wa ... -
在工作线程中创建Toast
2011-10-14 18:11 3696在工作线程中创建Toast,代码如下: p ... -
GridView + ViewFlipper布局界面,模仿“机锋市场”
2011-10-09 18:22 2239源码在附件中,效果如图片 -
fedora14下连接android真机
2011-08-13 13:22 1358在fedora14下搭建好了andro ... -
fedora14下搭建Android开发环境
2011-07-12 23:59 2533一:下载linux版本的JDK,Eclipse,Andr ... -
简述android线程间消息处理机制(Looper、Handler和Message)
2011-06-17 21:51 7651作用:Android的线程间消息处理机制主要是用来处理主 ... -
Android中ImageButton实现“按下”效果
2011-06-16 12:26 7609使用Button的时候,实现“按下”的效果是很重要的,也 ... -
Android实现TCP与UDP传输
2011-05-21 14:50 5360关于TCP和UDP协议的描述,可参考http://zho ... -
android textview改变部分文字的颜色和string.xml中文字的替换
2011-05-18 18:49 17250一:TextView组件改变部分文字的颜色: Text ... -
AndroiManifest.xml文件中android属性
2011-05-16 11:59 1411android:allowTaskReparentin ... -
windows系统上安装与使用Android NDK r5
2011-01-26 13:17 11316windows系统上安装与使用Android NDK r ... -
android获取屏幕分辨率
2011-01-15 17:05 2098获取屏幕分辨率的代码: ... -
Android编译出现Multiple substitutions specified in non-positional format
2010-12-31 13:28 3838前段时间更新了ADT和Android SDK 2.3, ... -
TextView设置中文粗体
2010-12-30 13:25 5476在xml布局文件中设置android:textStyle=“b ... -
Failed to install on device 'emulator-5554': timeout
2010-12-20 10:41 6162Failed to install on device ... -
解决android logcat不打印信息
2010-11-30 19:06 7879用eclipse进行android开发中经常遇到logcat无 ... -
关于android设备的分辨率
2010-11-29 12:27 1958HVGA (Half-size VGA) 即VGA ... -
Toast的用法
2010-11-18 13:28 4585Toast是android中用来显示快速显示短信息的一种机制, ... -
listview的美化和优化
2010-11-17 13:54 4305在android开发中,listview是比较常用的一个组件, ... -
activity切换特效(类似iphone的进入和退出时的效果)
2010-11-10 23:11 3876关于activity的切换,有很多挺好看的动画实现,最近在项目 ...
相关推荐
新浪RSS 新闻阅读器源码啊 android
Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例
Android开发实例:rss阅读器 源码
基于Android 平台的RSS阅读器的开发
新浪rss阅读器android源码,大家学习android的案例
基于Android平台的RSS阅读器的设计与开发
原创 自己写的源代码 导入即可用 Android 应用程序开发技术 rss阅读器实例 实现通过Rss地址阅读到新闻 网页等内容 可自己添加Rss地址 并保存至数据库 功能强大
1.添加自己喜欢的新闻版块 2.选择兴趣的新闻 3.快速预览新闻
Android_RSS阅读器设计与实现 在本系统是根据Google Android 平台用户的喜好和其平台的特性而设计的,在 Google Android平台自带的SDK1.5环境下,运用了Eclipse,PhotoShop等相关工具进行开发。本文概括的介绍了...
Android 开发应用源码 参考学习使用
基于Android平台的RSS阅读器开发与设计.doc
基于Android平台的RSS阅读器开发与设计实用文档doc.doc
基于Android平台的RSS阅读器开发与设计(完整资料).doc
RSS阅读器设计开发论文,内涵程序代码部分
基于Android的RSS阅读器设计.pdf
基于android平台的RSS阅读器设计与实现.pdf
第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 ...
楼主上一个android RSS阅读器资源的服务端,和上一个android客户端是一套,导入开发工具部署即可启动,数据库是mysql 5.0
Android应用源码开发Demo,主要用于毕业设计学习。
全书除了大量小型案例之外还包含了5个Android平台下的完整商业实例及源码分析,分别是RSS阅读器、基于GoogleMap的个人GPS、豆瓣客户端、在线音乐播放器、手机信息助手, * 随书附赠的光盘中包含389分钟的详细教学视频...