`
tianyafly2012
  • 浏览: 5939 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

flex客户端缓存应用

阅读更多
原文章: http://lib.airia.cn/2010/1119/FLEX_cache.html

flex或者flash客户端的缓存,并不是指浏览器的缓存,浏览器的缓存在一定时间后会过期。

使用flex或者flash开发出来的网站最大的问题就是swf文件过大,国内网速有限,导致加载时间过长,这样会丢失很多潜在的客户。

flex使用RSL技术,可以解决框架的缓存与共享,很大程度的解决了加载问题。但是如果项目过大,还是会导致加载时间很长这个问题。我使用了SharedObject进行客户端的SWF与Module的缓存,并进行版本控制。在服务器端做一个配置文件,客户端若有缓存过数据,则进行版本控制,达到客户端数据与服务器端数据保持一样。
例子:
假设现在有个Application的项目,生成的Application.swf文件是2028K,客户端的下载速度是100k/s,则差不多需要使用20秒的时间。现在将Application中的部分源码抽出来,使用Module机制,变成Application.swf 428K,Module1.swf 1000K,Module2.swf 600K。不使用缓存的话,完整的加载完Application还是需要差不多20秒时间,若使用缓存,将Module1.swf与Module2.swf缓存在客户端,则只需要加载Application.swf的428K,差不多4秒时间,加上Moduel的读取2秒时间,最多也就6-7秒时间。效率很明显。而且还可以缓存其他的乱七八糟的东西,例如皮肤.swf,图片资源.swf等等.如果有跳转页面的话,还可以将Application.swf也进行缓存。

问题:

如果遇到客户端不允许缓存,则跳过缓存,无碍程序的加载和运行。
如果一个用户,多次的打开本网站,说明对本网站有了一定的兴趣,在多次被询问是否允许缓存后,点击允许的可能性也加 大。
当用户能够清楚的了解到缓存的好处时,允许缓存,一.可以加速用户体验,二.可以降低服务器压力,三.可以降低服务器带宽的使用。
文章最后有一个Demo供下载测试使用,源代码暂时打包成SWC,未开放出来。

下面将解释一下如何使用WarmC.swc:

配置文件Cache_config.xml

<data id="moduleOne" version="beta01"/>
<data id="moduleTwo" version="beta01"/>
<data id="mySwf" version="beta01"/>


*当然,配置文件的路径,和名字可以由你任取,但需要在版本控制时指定路径,下面将介绍如何启动版本控制
*id属性,标记这个缓存的名字,将会在全局使用,包括缓存的SharedObject名称,以及版本控制,下面读取缓存时将会使用到这个id
*version版本控制,随你起名称。但是为了确保不会与以前的版本混淆,推荐最好还是使用递增的版本名称

首先必须在缓存的使用之前先启动版本控制,需要导入以下包:
import WarmC.Cache.LocationDataProxy;

然后启动版本控制:
LocationDataProxy.getInstance().CacheReBuild(0.5);

CacheReBuild(size:int,configUrl:String)方法使用说明:

* size参数,指定缓存的总大小,单位为兆(M),不填则默认为1M即运行到这个地方时,就会判断客户端的SharedObject 允许缓存大小,再提示用户修改缓存最大值设置如果你需要缓存的数据较大,则可对应取下面的值
size<=0 不提示,或者默认客户端的100Kb
0
LocationDataProxy.getInstance().Warm_Human(true);

Warm_Human(bool:Boolean)说明:

* FlashPlayer的SharedObject,在使用超过客户端的设置大小后,就会提示用户,并征求其意见,是否同意网站的缓存
* 如果,在系统需要缓存多个数据时,而且用户拒绝了缓存,系统将会在每次需要写入SharedObject时,都进行询问是否允许缓存,这样的用户体验十分糟糕。
*当设置Warm_Huma为true时,在第一次提示用户是否允许程序缓存改大小后,如果用户拒绝了,以后的缓存将不会再提示,也不会再在客户端缓存,直到用户再次运行此程序.
* false,不管用户是否拒绝,每次需要增大缓存区大小时,都会提示用户
* 不使用该方法,默认为true。所以这个方法很少用到。
确保版本控制启动成功后,可以进行module加载,先导入以下包:
import WarmC.Cache.ModuleCacheProxy;

加载module
ModuleCacheProxy.getInstance().load("moduleOne","ModuleOne.swf",onProgress,onReady);
function onProgress(bytesLoaded:uint,bytesTotal:uint):void{
        trace(">加载ModuleOne:"+bytesLoaded+"/"+bytesTotal);
}
function onReady(data:Object):void{
        trace(">ModuleOne 加载完成!");
        Application.application.addChild(data as UIComponent);
}


* load(name:String,url:String,onProgress:Function,onReady:Function)说明:
* name,指的是Module在配置文件Cache_config文件中的ID,此处必须与配置文件一致。用于版本控制,以及
客户端的缓存文件名,通过name获取SharedObject
* url,指的是Module的Swf文件路径,Demo的Module文件均在根目录,所以直接指定名称
* onProgress,指加载Module时的进度回调方法,传回两个参数,bytesLoaded与bytesTotal,若需要显示进度条,则这个方法是必备的。如果缓存不存在,则bytesLoaded与bytesTotal会是从服务器端加载数据的值;
如果缓存已经存在,则该方法只调用一次,而且两个回传参数均是100
* onReady,指加载完成后的回调方法,传回一个UIComponent类型的参数data
* 代理器使用了饿汉单例模式,检测module是否已经缓存在客户端。
* 如果已经缓存在客户端,则直接读取
* 否则,从服务器端加载,显示,再缓存到客户端,打上版本。
加载SWF(非module),需导入以下包:
import WarmC.Cache.SwfCacheProxy;

加载SWF:
SwfCacheProxy.getInstance().load("mySwf","test.swf",onProgress,onReady);
function onProgress(bytesLoaded:uint,bytesTotal:uint):void{
        trace(">加载SWF:"+bytesLoaded+"/"+bytesTotal);
}
function onReady(data:Object):void{
        trace(">SWF 加载完成!");
        var load:Loader = new Loader()
        load.loadBytes( data as ByteArray );
        var uic:UIComponent=new UIComponent();
        uic.addChild(load);
        Application.application.addChild(uic);
}


load(name:String,url:String,onProgress:Function,onReady:Function)说明:

*属性作用与ModuleCacheProxy一样
*唯一不同点,onReady方法的回传参数为一个ByteArray,需要自己进行包装目前使用起来就是这样。你可以使用SwfCacheProxy来缓存皮肤Style.swf,游戏插件,图片资源等等Swf数据。
在例子中,有个“加载Module 2”:
private function loadModule2():void{
        ModuleCacheProxy.getInstance().load("moduleTwo","ModuleTwo.swf",onProgress,onReady);
        ModuleCacheProxy.getInstance().load("moduleTwo","ModuleTwo.swf",onProgress,onReady);
        function onProgress(bytesLoaded:uint,bytesTotal:uint):void{
                trace(">加载ModuleTwo:"+bytesLoaded+"/"+bytesTotal);
        }
        function onReady(data:Object):void{
                trace(">ModuleTwo 加载完成!");
                Application.application.addChild(data as UIComponent);
        }
}
分享到:
评论

相关推荐

    flex 客户端缓存

    Flex客户端缓存是一种技术,主要用于优化Flex应用的性能,尤其是对于那些包含大量SWF文件或者需要频繁更新数据的应用。在Flex3中,客户端缓存机制是开发者用来减少网络带宽消耗、提高用户交互速度的关键工具。本文将...

    Flex客户端IE浏览器缓存问题

    在IT行业中,尤其是在Web开发领域,Flex是一种广泛使用的富互联网应用程序(RIA)开发框架,它基于ActionScript和Flash Player,可以创建动态、交互性强的用户界面。然而,当使用Flex开发的SWF文件部署到服务器时,...

    blazeDs解决flex客户端与Server的远程通讯

    BlazeDS是Adobe公司推出的一款开源的服务器端技术,它主要负责实现Flex客户端与服务器之间的实时双向通信。Flex是一种用于构建富互联网应用程序(RIA)的客户端框架,而BlazeDS则是其背后的通信引擎,提供了数据推送...

    flex企业应用开发实践.pdf

    本书的最后一部分着重讨论了Flex应用的性能优化策略,包括但不限于代码优化、资源加载策略、缓存机制、网络通信优化等方面。通过这些优化措施,可以显著提升Flex应用的运行效率和用户体验,为企业级应用的稳定运行和...

    flex整合spring需要的spring相关包

    在整合Flex和Spring时,关键在于如何使Flex客户端能够与Spring服务端进行通信。以下是一些核心知识点: 1. **AMF通信协议**:Adobe Message Format (AMF) 是Flex与服务器之间进行数据交换的高效二进制格式。Spring ...

    FlexSpring jar包

    此外,可能还需要配置服务器端的AMF Gateway,如BlazeDS或GranitedDS,它们负责处理Flex客户端与Spring服务之间的通信。 在实际项目中,为了成功集成FlexSpring,开发者需要了解以下几个关键步骤: 1. **设置Flex...

    Spring Flex 整合

    3. **Spring Remoting**: 这是Spring框架的一部分,它允许Flex客户端与Spring应用服务器端的服务进行远程调用。常用的方式有HTTPInvoker和HTTPService。 **三、开发流程** 1. **设置项目结构**: 创建Spring MVC...

    java连接flex代码

    通过在Java后端创建DAO(数据访问对象),使用Hibernate操作数据库,然后通过AMF将结果返回给Flex客户端,实现数据的CRUD(创建、读取、更新、删除)操作。 4. **Flex客户端开发**:在Flex端,可以使用RemoteObject...

    Flex 应用程序性能: 改善客户端应用程序和服务器性能的技巧与技术

    ### Flex 应用程序性能:改善客户端应用程序和服务器性能的技巧与技术 #### 概述 随着互联网技术的发展,富互联网应用(RIA)的需求日益增长。Macromedia Flex 是一个强大的平台,它允许开发者创建高性能的 RIA。...

    flex spring

    然后,定义ActionScript方法调用这个Service,将数据传递到服务器端,服务器端的Spring服务处理完业务逻辑后,通过AMF将结果返回给Flex客户端。 7. **安全和性能考虑** 在实际项目中,除了关注功能实现,还需要考虑...

    java 整合 flex项目

    这允许Flex客户端通过Java服务调用来操作数据,而无需直接操作SQL。配置Hibernate涉及创建实体类、映射文件(通常是XML或注解形式)以及配置数据源。 **Flex技术** Flex是由Adobe开发的开源框架,用于构建RIA。它...

    flex用到JMS代码下载

    在这个场景下,你需要下载Tomcat,将Flex Blazeds JMS Demo应用部署到Tomcat中,使其成为Flex客户端与ActiveMQ交互的桥梁。 4. **BlazeDS**: BlazeDS是Adobe提供的一个免费服务器端组件,用于在Flex和Java应用...

    Flex 应用,BlazeDS通信

    BlazeDS是Adobe提供的一个免费的服务器端数据服务组件,它允许Flex客户端与Java后端进行实时双向通信,实现数据的高效传输和同步。 在Flex应用中,BlazeDS通信扮演着关键角色,它是连接Flex前端和Java后端服务器的...

    基于ArcGIS Flex API开发Flex AIR Mobile应用

    Flex是基于ActionScript 3.0和MXML的开发框架,用于构建富客户端应用。它提供了丰富的用户界面组件和强大的数据绑定机制,适合构建复杂的交互式应用程序。Adobe AIR则为这些Flex应用提供了一个本地运行时,使它们...

    flex的ppt(flex和java的整合及flex组件的应用共31章)

    通过使用 BlazeDS、LiveCycle Data Services 或其他AMF(Action Message Format)适配器,开发者可以实现Flex客户端与Java后端之间的无缝通信。这种整合使得数据能够高效、安全地在两者之间传输,提高了应用程序的...

    flex和hibernate的整合

    6. **缓存策略**:为了提高性能,可以利用Hibernate的二级缓存机制,以及在Flex客户端对数据进行适当的缓存。这可以减少不必要的服务器请求,提高用户体验。 7. **安全性**:整合过程中还需要考虑安全问题,如身份...

    flex 与Java通讯

    4. Flex客户端开发:在Flex应用中创建RemoteObject或HTTPService,指定Java服务的URL和方法名。 5. 数据交换:Flex客户端调用Java服务,Java服务处理请求并返回结果,通过AMF或SOAP进行数据交换。 6. 错误处理与...

    flex-webiter.jar.zip

    在Flex的上下文中,Flex Webtier扮演着连接Flex客户端应用程序与服务器端业务逻辑的关键角色。 Flex Webtier提供了以下关键功能: 1. **通信层**:它实现了AMF(Action Message Format)协议,这是一种高效的二...

    Flex与java通信源码

    Flex与Java通信是Web开发中的一个重要技术领域,它允许用户在浏览器端通过Flex客户端与后端Java服务器进行数据交互,实现动态、富交互性的应用程序。本源码可能包含了一个示例项目,展示了如何使用Flex与Java进行...

    java flex jar包

    4. **Flex客户端与Java服务的通信**:在Flex应用中,我们可以使用`RemoteObject`组件来调用Java服务。在Java端,服务端点通常通过Spring、Java EE的EJB或Servlet来实现。一旦调用建立,数据会通过AMF协议在两者间...

Global site tag (gtag.js) - Google Analytics