Simple Flex RSS Reader using Cairngorm 研究

本文介绍了一个RSS阅读器的应用结构及其事件处理流程。重点分析了从URI组件创建完成触发事件,到控制器接收并处理事件,再到命令对象执行具体业务逻辑的全过程。
显示结构
下图是RssReader的显示结构。可以发现,除了可视化组件(绿色)外,非可视化组件(红色)也用mxml的方式组装到整个Application中。这样做的目的是为了更好的利用Flex中的事件传播机制。


事件流
下面看一下RssReader初始化时的事件流。(其他的事件流可以用同样的方法进行分析)


<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8"> <meta name="GENERATOR" content="StarSuite 8 (Linux)"> <meta name="AUTHOR" content="Seaman Wang"> <meta name="CREATED" content="20071113;19364300"> <meta name="CHANGEDBY" content="Seaman Wang"> <meta name="CHANGED" content="20071114;11552500"> <style type="text/css"> <!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> </style>
  1. URI中监听了creationComplete事件。当创建URI完成后,会调用handleCreationComplete方法,设置的URL,然后再调用CairngormEventDispatcherdispatch方法,发布自定义的GetFeedEvent事件。

    代码如下:

<? xmlversion="1.0"encoding="utf-8" ?>
< mx:HBox xmlns:mx ="http://www.adobe.com/2006/mxml" creationComplete ="handleCreationComplete()" >

< mx:Script >
<![CDATA[
importcom.nagpals.flexrssreader.events.GetFeedEvent;
importcom.adobe.cairngorm.control.CairngormEventDispatcher;
importcom.nagpals.flexrssreader.model.RSSReaderModelLocator;

[Bindable]privatevarmodel:RSSReaderModelLocator=RSSReaderModelLocator.getInstance();

privatefunctiongeturi(selecteduri:String):void{
CairngormEventDispatcher.getInstance().dispatchEvent(newGetFeedEvent(selecteduri));
}

privatefunctionhandleCreationComplete():void{
model.feedURI="http://news.com.com/8300-10784_3-7.xml";
geturi(model.feedURI);
}

]]>
</ mx:Script >
< mx:Label text ="EnterURLforanRSSfeed" fontSize ="12" paddingTop ="4" fontWeight ="bold" />
< mx:TextInput id ="uritext" width ="400" text ="{model.feedURI}" fontSize ="12" />
< mx:Button id ="uributton" label ="GetFeed" click ="geturi(uritext.text)" fontSize ="12" />
</ mx:HBox >

<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8"> <meta name="GENERATOR" content="StarSuite 8 (Linux)"> <meta name="AUTHOR" content="Seaman Wang"> <meta name="CREATED" content="20071113;19364300"> <meta name="CHANGEDBY" content="Seaman Wang"> <meta name="CHANGED" content="20071114;11552500"> <style type="text/css"> <!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --></style> 2. RSSReaderController 中注册了 GetFeedEvent 的监听器。会接收到 FlashPlayer 分发的事件,并根据事先的定义调用 GetFeedCommand 进行处理。
packagecom.nagpals.flexrssreader.control ... {
importcom.adobe.cairngorm.control.FrontController;
importcom.nagpals.flexrssreader.commands.
*;
importcom.nagpals.flexrssreader.events.
*;

publicclassRSSReaderControllerextendsFrontController...{
publicfunctionRSSReaderController()...{
this.initialize();
}


privatefunctioninitialize():void...{
this.addCommand(RSSReaderController.GET_FEED,GetFeedCommand);
this.addCommand(RSSReaderController.SELECT_ITEM,SelectItemCommand);
}


/**//*-------------------------------------------------*/
publicstaticconstGET_FEED:String="getFeed";
publicstaticconstSELECT_ITEM:String="selectItem";

}

}

3.GetFeedCommand调用business.GetFeedDelegate处理逻辑,GetFeedDelegate通过HTTPService获取RSS数据后将结果返回给GetFeedCommand。代码如下:
publicclassGetFeedCommandimplementsICommand,IResponder ... {
private
vardelegate:GetFeedDelegate;
private
varmodel:RSSReaderModelLocator=RSSReaderModelLocator.getInstance();

public
functionGetFeedCommand()...{
delegate
=newGetFeedDelegate(this);
}


public
functionexecute(event:CairngormEvent):void...{
varfeedEvent:GetFeedEvent=GetFeedEvent(event);
model.feedURI
=feedEvent.selecteduri;
delegate.getFeed();
}


public
functionresult(event:Object):void...{
model.feedVOList
=event.result.rss.channel.itemasArrayCollection;
model.feedTitle
=StringUtil.trim(event.result.rss.channel.title);
model.feedTitleLink
=StringUtil.trim(event.result.rss.channel.link);
}


public
functionfault(event:Object):void...{
mx.controls.Alert.show(
"Erroringettingfeed:"+event.message);
}


}

4. 如果正常返回结果,GetFeedCommand会更新作为model的 RSSReaderModelLocator中的数据。而 RSSReaderModelLocator声明为[Bindable],当数据发生变化时会发出“propertyChange”事件。
(关于数据绑定的内容,请参考
flex事件机制1:事件源 )。
5. FlashPlayer接收到propertyChange事件后,会分发给所有绑定到model的组件,这些组件将自动更新数据。至此,整个初始化的过程就执行完毕。
Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计原则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值