您现在的位置: 365建站网 > 365学习 > flex一些必备的基础知识及其编译的深度剖析

flex一些必备的基础知识及其编译的深度剖析

文章来源:365jz.com     点击数:685    更新时间:2009-11-15 17:05   参与评论

 下面是关于事件弱引用的:

如果我们使用强引用(默认情况),FLASH的垃圾回收不会释放这个引用实例,尽管你把这个对象置为null或是其它,除非你手动去执行removeListener()方法,这里还有一个方法就是在添加事件时候使用弱引用。 一般情况我们在添加一个事件的时候,比如给一个按钮添加一个onclick事件,我们的写法是: button.addEventListener(Event.click,onclick);这种时候是强引用,因为addEventListener还有几个默认的参数useCapture=false,priority=0;useWeakReference=false , 因此添加一个弱引用的方法是: yourobject.addEventListener(Type, function, false, 0, true); 什么情况应该使用强引用,什么情况不应该使用呢? 当一些变量是成员变量(比如界面上不需要删除的BUTTON),这种它的生命周期和listener是一样的(意思是中间不用动态删除在重复产生)这种情况我们不用考虑弱引用; 当一些对象是不稳定的,动态变化的,比如TIMER,flashplayer认为它是整个生命周期的,应该使用弱引用,如果你使用强引用,这个timer对象将永远不会垃圾回收。(注意) 所以我们使用timer时候一定要这么写:myTimer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true

类级别成员函数不属于垃圾回收的对象,因此可以对类级别成员函数将 useWeakReference 设置为 true 而不会使它们受垃圾回收的影响。如果对作为嵌套内部函数的侦听器将 useWeakReference 设置为 true,则该函数将作为垃圾回收并且不再是永久函数。如果创建对该内部函数的引用(将该函数保存到另一个变量中),则该函数将不作为垃圾回收并仍将保持永久。

简单总结:对一些不想永久保存的事件侦听函数,使用弱引用,对一些固定的,永久保存的侦听器,如上面说的类级别的成员,请使用强引用。

下面是一些关于flex的生面周期的的基础知识:

  Initlization


Construction
Construction是组件构造阶段,组件的构造器不能有必须的参数。在构造函数中可以添加事件监听器,初始化属性。这个阶段只做很少的事情。

Configuration
Configuration是组件的配置阶段,组件的属性,事件回调函数,样式和效果定义都在这个阶段完成。你不应该把这些任务推迟到Attachment和Initlization阶段之后。

Attachment
Attachment阶段是把该组件追加到显示列表当中,一个Flex组件会被一个Flex容器IContianer以addChild方法添加到显示列表当中。

Initlization
在Initlization初始化阶段,组件会执行一次完整的invalidation/validation周期。这个阶段做的工作流程是:

  • 发出preinitialize事件。
  • 执行方法createChildren()
  • 发出initialize事件。
  • 行一次完整的invalidation/validation周期。
  • 发出creationComplete事件。





2. Updating


用户可能会与组件产生交互,组件的位置大小可能改变,样式可能被重新赋值,也可能获得焦点或者被禁用等等。这些情况的发生都用影响到组件外观的变化。所以组件需要重绘自身来响应这些变化。

Invalidation
如果一个组件的属性改变,它可能就会标记组件为失效状态。

Validation
一个组件被标记失效后,会验证是否需要更新组件,如果需要会调用相关的方法来更新。组件有三个极其重要的方法来更新自己:

  • commitProperties()
  • measure()
  • updateDisplayList(unscaledWidth,unscaledHeight)

除了这三个方法,还有一个重要的方法是styleChanged(styleName),当某个样式改变时,styleChanged被调用,然后执行Invalidation标记组件。如果你有自定义一个组件,有一些法则必要得遵守:

不要在子类中显式调用commitProperties,measure和updateDisplayList这三个方法,你要做的是override,而不是call。如果你添加了新的样式,同样是要继承styleChanged方法,加入自己的逻辑。



3. Destruction


Detachment
当不需要这个组件时,把它从显示列表中移出。把组件从一个容器中移出再添加到另一个容器中比创建新的组件有更小的开销。

Garbage Collection

如果组件不再被引用时,它就成为符合垃圾回收的对象了,所以垃圾回收的第一条准则是不再有活动的引用。
更加值得注意的是第二条准则,即不包含使用了强引用的事件监听器,Dictionary和Timer。
所以尽量使用弱引用是多么重要,但是同样,小心你的弱引用在不该回收的时刻被回收了。例如对函数中的临时变量使用弱引用,你可能得不到你想要的异步结果

上面值得我们注意的是:Update的细述: 

  • commitProperties()
  • measure()
  • updateDisplayList(unscaledWidth,unscaledHeight)
  • 是flash player在组件更新时自动调用的 这也就是为什么不需要调用,而只需override .
  • 下面是是来自  整个flex程序运行的基本过程:

    1. First, enough bytes for frame 1 are streamed down to the Flash Player.
    2. The Flash Player executes those bytes by creating a SystemManager instance.
    3. SystemManager instruct the Flash Player to stop at the end of frame 1.
    4. SystemManager then goes on to create the Preloader which creates the DownloadProgressBar control and pops that up on the client screen.
    1. The Preloader then starts tracking the rest of the bytes streaming in from the Flex SWF (or from external SWFs).
      Once all the bytes for the Flex framework and application code are in, the System Manager goes on to frame 2 and instantiates the Application instance.
    2. All RSLs and their associated classes are now loaded [into the ApplicationDomain]; note that the load order is in the order defined during app compile time.[3]
    • All class definitions used by the application (views, logic, etc) must be loaded prior to Frame 2. It is here, in Frame1, that your preloader code can even install patches to the Flex framework BEFORE the framework classes themselves are loaded.
    • This technique is called "monkey-patching" and will be used later
      when we are discussing the decryption process.
    1. Once the Application instance has been created, the SystemManager sets Application.systemManager to itself. This is how you, the application developer, can access the SystemManager at a later time.
    2. The Application dispatches the preinitialize event at the beginning of the initialization process.
    3. Application goes on to create its children. The method createChildren() is called on the application. At this point each of the application’s components is being constructed, and each component’s createChildren() will be also called. For detail, look at component lifecycle section.
    4. The Application dispatches the initialize event, which indicates that all application’s components have been initialized. However, at this state, all the components are not yet laid out.
    5. Eventually, once all the Application child controls and containers have been created, sized and positioned, the Application dispatches the creationComplete event.
    6. Once the creationComplete event has been dispatched, the Preloader removes the DownloadProgressBar control and the SystemManager adds the Application instance to the Flash Player display list. (The Flash Player display list is basically the tree of visible or potentially visible objects that make up your application. When you add and remove child components to your application, your basically just adding and removing them from the display list).
    7. Once the Application is added to the Flash Player display list, the Application dispatches its applicationComplete event
    8. The Application has been created and is up on the screen ready to be interacted with.

    对于后面几条大家都比较熟悉,主要是前面几条:下面对前面几条做一下概述:

      flash player 加载足够多的字节流后就通过SystemManager类的实例来执行这些字节流,并且让flash player 停止在第一帧。然后创建Preloader  ,通过Preloader  创建 DownloadProgressBar并让DownloadProgressBar显示在屏幕上。

    Preloader然后跟踪剩下的flex SWF的字节流 (包括外部的swf 比如 我们创建flex工程时都有的playerProductInstall.swf文件) 

    当这些字节流都进入flash player后,就进入到第二帧Application的实例化过程

    如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


    发表评论 (685人查看0条评论)
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码: 点击我更换图片
    最新评论
    ------分隔线----------------------------