`

callLater解析

    博客分类:
  • Flex
 
阅读更多

转载--

 

Flash的fl组件和Flex的mx组件都有一个受保护方法callLater,callLater可以说是优化组件执行效率的一个杀手锏,极其有用。

拿Flash的fl组件为例,fl组件有个重绘方法redraw(),如果改变组件的大小,焦点的获得和丢失都会是组件重绘来呈现不同的状态。而组件是复杂的,重绘的开销很大。如果假想一个按钮执行以下程式来更改外观,并且每次的更改都触发redraw()方法执行,那它将执行3次重绘,很显然是不须要的。

1 button.width=200;
2 button.height=28;
3 button.setStyle("textFormat",myTextFormat);

 

一个优化的方式是假设组件不会自动重绘,需要手动进行:

1 button.width=200;
2 button.height=28;
3 button.setStyle("textFormat",myTextFormat);
4 button.redraw();

 

这个方式不太友好,每次都要记得去重绘组件,幸运的是callLater解决了这个问题。

callLater把要执行的函数延迟到下一帧。所以对button的width更改后,它会记得在下一帧重绘自身,当然这一帧你还改变了height和样式,它也只是重复地记忆要在下一帧重绘自身。到了下一帧的时候,它执行一次redraw(),仅是一次。

Flex组件的基类UIComponent有110多个公开属性,90个公开方法,17个受保护方法,70多个事件,10多个样式,10多个效果,还有6个常量。一个基类都如此庞大,可想而知,优化是多么重要。
在Flex组件的callLater中,重绘被分割成了三个受保护的方法:

  • commitProperties()
  • measure()
  • updateDisplayList()

    职责的分割更加提高了效率,这些延迟执行都是callLater实现的。把callLater实现的细节抽取下来写成一个单独的类:

    01 package com.colorhook.tools{
    02    
    03     /**
    04      *  @author colorhook
    05      * @copyright http://www.colorhook.com
    06      */
    07    
    08      import flash.display.DisplayObject;
    09      import flash.utils.Dictionary;
    10      import flash.events.Event;
    11    
    12     public class FrameCallLater implements ICallLater{
    13    
    14         private var _target:DisplayObject;
    15         private var methods:Dictionary;
    16         private var inCallLaterPhase:Boolean=false;
    17    
    18         public function FrameCallLater(target:DisplayObject){
    19             this._target=target;
    20             methods=new Dictionary(true);
    21             super();
    22         }
    23    
    24         /**
    25          * defined by ICallLater, I write a class TimeCallLater to implement it also.
    26          */
    27         public function call(fun:Function):void{
    28             if (inCallLaterPhase||_target==null) { return; }
    29    
    30             methods[fun]=true;
    31    
    32             if (_target.stage != null) {
    33                 _target.stage.addEventListener(Event.RENDER,callLaterDispatcher,false,0,true);
    34                 _target.stage.invalidate();
    35             } else {
    36                 _target.addEventListener(Event.ADDED_TO_STAGE,callLaterDispatcher,false,0,true);
    37             }
    38         }
    39    
    40         private function callLaterDispatcher(event:Event):void {
    41             if (event.type == Event.ADDED_TO_STAGE) {
    42                 _target.removeEventListener(Event.ADDED_TO_STAGE,callLaterDispatcher);
    43                 _target.stage.addEventListener(Event.RENDER,callLaterDispatcher,false,0,true);
    44                 _target.stage.invalidate();
    45                 return;
    46             } else {
    47                 event.target.removeEventListener(Event.RENDER,callLaterDispatcher);
    48                 if (_target.stage == null) {
    49                     _target.addEventListener(Event.ADDED_TO_STAGE,callLaterDispatcher,false,0,true);
    50                     return;
    51                 }
    52             }
    53    
    54             inCallLaterPhase = true;
    55    
    56             for (var method:Object in methods) {
    57                 method();
    58                 delete(methods[method]);
    59             }
    60             inCallLaterPhase = false;
    61         }
    62    
    63         public function get target():DisplayObject{
    64             return _target;
    65         }
    66    
    67     }
    68 }
  • *****************************************************

    找了很久的资料,才解决tree加载时显示所有节点这个问题,引自http://hi.baidu.com/lz0830/blog/item/7b406e82d7f41c98f703a632.html

    该文中提出Tree的数据源在MXML文件中和数据源是从后台程序获取两种情况:

    一、针对第一种情况(tree的数据源在MXML文件中)的写法:

    private function initApp():void {
         
    for each(var item:XML in this.myTree.dataProvider)
               this.myTree.expandChildrenOf(item,true);

    }

    该函数的调用creationComplete="initApp()"

     

    二、数据源从后台程序获取

    <!--  读取xml文件给tree绑定数据源 -->
    <mx:HTTPService id="tree_httpsrv" url="assets/data/treeview.xml"  result="setTree(event)" fault="faultOperation(event)"  resultFormat="xml" />

    <!-- 读取xml文件的处理  -->

    [Bindable]
    private var tree_xml:XML;

    private function setTree(event:ResultEvent):void
    {
           tree_xml = XML(event.result);
           var tree_data:XMLList = tree_xml.treeviewNode;
           myTree.dataProvider = tree_data;
           myTree.callLater(expandTree);
    }

    private function expandTree():void
    {
           //expand all tree node
           myTree.expandChildrenOf(tree_xml,true);
    }

    分享到:
    评论

    相关推荐

      Twisted网络编程必备

      此外,Twisted包含了大量预建的功能模块,如电子邮件、Web服务器、新闻服务器、聊天服务器、DNS解析、SSH安全连接、Telnet终端、远程过程调用(RPC)以及数据库访问等。这些模块使得开发者能够快速构建出复杂的应用...

      实例解析Python的Twisted框架中Deferred对象的用法

      ### 实例解析Python的Twisted框架中Deferred对象的用法 #### 一、Deferred对象概述 在探讨Deferred对象之前,我们需要了解Twisted框架的核心特点之一就是它的异步性。Twisted是一个事件驱动的网络引擎,它通过非...

      JS闭包可被利用的常见场景小结

      这里,`callLater` 函数利用闭包,返回了一个匿名函数,该匿名函数能够访问外部函数`callLater`的参数。调用`callLater`并传入参数后,我们可以得到一个可以延迟执行的函数引用,并将这个引用传递给`setTimeout`: ...

      基于typescript实现的计时器

      TS实现的定时器/计时器,可自行翻译到其他语言 举例 翻译到C#后 long times = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); long times_now = DateTimeOffset....callLater//下一帧 property: scale//时间缩放倍率

      聊天室(ActionScript 3.0实现)

      2. **数据格式**:通常,聊天消息会被编码为JSON或XML格式,便于解析和传输。AS3提供了内置的`ObjectProxy`和`XML`类来处理这些数据结构。 三、客户端实现 1. **用户界面**:使用AS3的`Sprite`和`TextField`等组件...

      JS闭包可被利用的常见场景

      function callLater(paramA, paramB, paramC) { // 使用函数表达式创建并返回一个匿名内部函数的引用 return function() { // 内部函数将被 setTimeout 函数执行,并能访问外部函数传递的参数 paramA[paramB] = ...

      flash as3接口的实现

      public function callLater(callback:function):void { // 某些异步操作完成后调用callback } callLater(function(event:Event):void { // 回调函数的实现 }); ``` 虽然这里没有明确声明接口,但`function(event:...

      js面向对象简单编程[文].pdf

      callLater(function() { console.log("Hello, world!"); }, 1000); ``` - **arguments对象**:在函数内部,`arguments`对象包含了所有传递给函数的参数,即使它们没有在函数签名中声明。 - **call和apply方法**...

      Flex试题 .txt

      根据给定的文件信息,以下是对“Flex试题.txt”中提到的关键知识点的详细解析: ### 1. Flex是什么? Flex是一种开源的软件框架,由Adobe Systems开发,用于构建跨平台的富互联网应用程序(RIA)。它使用MXML和...

      Python-txZMQ基于Twisted的ZeroMQ消息库的Python封装

      对于异步操作,你可以使用`callLater`或`deferToThread`等Twisted的调度函数来处理消息的发送和接收。 txZMQ提供了一些高级接口,如`ZMQStream`,它允许开发者将ZeroMQ套接字与Twisted的I/O事件流相结合。这样,...

      Python的Twisted框架中使用Deferred对象来管理回调函数

      reactor.callLater(2, deferred.callback, inputData * 3) return deferred def cbPrintData(result): print('Result received:', result) deferred = getDummyData(3) deferred.addCallback(cbPrintData) ...

      分析Python编程时利用wxPython来支持多线程的方法

      wxPython中有三个“线程安全”的函数:wx.PostEvent、wx.CallAfter和wx.CallLater。这三个函数在使用时可以保证GUI线程的稳定运行,避免因多线程操作而产生不可预知的错误。 wx.PostEvent允许你将一个事件对象放入...

      flex 等待界面显示

      Flex支持异步编程模型,如使用`AsyncToken`对象和`callLater()`方法,可以避免UI线程阻塞,确保等待界面的平滑显示。 5. **优化用户体验**: - **延迟显示**:不必要一开始就显示等待界面,只有当后台任务执行...

      使用Python的Twisted框架编写简单的网络客户端

      reactor.callLater(1, p.sendMessage, "This is sent in a second") reactor.callLater(2, p.transport.loseConnection) c = ClientCreator(reactor, Greeter) c.connectTCP("localhost", 1234).addCallback...

      ActionScript3 性能调整 英文

      为了解决这一问题,可以使用`mx.core.UIComponent.callLater()`函数将ActionScript的执行推迟到下一帧周期。 ### 三、类型声明优化字节码 类型声明在ActionScript 3中扮演着至关重要的角色。它不仅提高了代码的...

      python如何通过twisted实现数据库异步插入

      使用`reactor.callLater`可以设置一个延迟时间,在这个时间后执行`reactor.stop`来停止Reactor。然后调用`reactor.run`来启动Reactor循环,这样才能实际运行异步操作。 对于异步编程,还需要注意异常处理和资源管理...

      python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例

      reactor.callLater(1, self.processHeadline, input) # 延迟1秒后执行processHeadline self.d.addCallback(self._toHTML) # 成功后执行_toHTML return self.d # ...省略的代码... def printData(result): ...

      使用Python的Treq on Twisted来进行HTTP压力测试

      reactor.callLater(1, counter) # 请求完成时的回调 def body_received(body): global req_done req_done += 1 def request_done(response): global req_made deferred = treq.json_content(response) req_...

    Global site tag (gtag.js) - Google Analytics