- 浏览: 60832 次
- 来自: 北京
文章分类
最新评论
-
pengylfighting:
太感谢了
tomcat启动慢问题 -
shoushou2001:
很好很强大,
项目在tomcat中能运行,可是在WebLogic中部署就跑错的解决方案 -
java风:
严重错误 主要是程序的错误
WARN 为一般警告,比如ses ...
配置Log4j
转载--
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中,重绘被分割成了三个受保护的方法:
职责的分割更加提高了效率,这些延迟执行都是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);
}
发表评论
-
Flex事件效果与渲染
2011-11-28 15:38 857触发器名称 对 ... -
SystemManager: Every Flex application’s best friend
2011-11-16 09:54 637SystemManager: Every Flex appli ... -
preloader
2011-11-14 15:55 468Flex 的默认的 Preloader, 平心而论,不是很 ... -
xml小心障眼
2011-11-11 18:13 0test.xml: <?xml version=& ... -
itemRenderer
2011-11-11 16:15 1266理解itemRenderer Flex中提供了大 ... -
Flex的注释
2011-11-11 15:28 596一.在<mx:script>标签中写注释 1.用 ... -
flex与js交互
2011-11-09 16:47 522一、在JavaScript中调用Flex方法在Flex中可以用 ... -
Flex Data Binding详解
2011-11-09 15:33 537转载-- Data BindIng简单的说就是当绑定源 ... -
在Flex中让Tree绑定数据后自动展开树节点
2011-11-09 11:00 660转载-- 用Flex/Flash做开发的同志们应该会 ... -
flex百条常用知识
2011-11-07 11:12 0flex百条常用知识 【 ... -
Flex 自定义事件
2011-11-07 11:09 570Flex 自定义事件 public static co ... -
AS3 数据类型转换 (转)
2011-11-07 10:22 1196AS3 数据类型转换 (转) ... -
AS3中遍历xml
2011-11-07 10:16 645AS3中遍历xml ... -
flex 数据基础-使用XML和XMLList
2011-11-07 10:08 630flex 数据基础-使用XML和XMLList ... -
flex 数据基础-使用XML和XMLList
2011-11-07 10:07 861flex 数据基础-使用XML和XMLList ... -
Flex自定义事件用法指南
2011-11-06 11:09 632Flex自定义事件用法指南 本文向大家介绍一下Fle ... -
Flex的Array和ArrayCollection
2011-11-06 10:39 5081.array作为控件使用 FLEX3写法: ... -
flex命名空间
2011-11-04 11:17 0Flex 4带给我们的,是全新的命名空间。了解这些命名空间必 ... -
沙箱安全
2011-11-04 11:08 0Flex的最重要两个文件:MXML文件与AS文件。 M ... -
Module通信的几个方法
2011-11-04 11:02 0推荐:启网 - 专业的主机、服务器合租提供商 17hz.ne ...
相关推荐
此外,Twisted包含了大量预建的功能模块,如电子邮件、Web服务器、新闻服务器、聊天服务器、DNS解析、SSH安全连接、Telnet终端、远程过程调用(RPC)以及数据库访问等。这些模块使得开发者能够快速构建出复杂的应用...
### 实例解析Python的Twisted框架中Deferred对象的用法 #### 一、Deferred对象概述 在探讨Deferred对象之前,我们需要了解Twisted框架的核心特点之一就是它的异步性。Twisted是一个事件驱动的网络引擎,它通过非...
这里,`callLater` 函数利用闭包,返回了一个匿名函数,该匿名函数能够访问外部函数`callLater`的参数。调用`callLater`并传入参数后,我们可以得到一个可以延迟执行的函数引用,并将这个引用传递给`setTimeout`: ...
TS实现的定时器/计时器,可自行翻译到其他语言 举例 翻译到C#后 long times = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); long times_now = DateTimeOffset....callLater//下一帧 property: scale//时间缩放倍率
2. **数据格式**:通常,聊天消息会被编码为JSON或XML格式,便于解析和传输。AS3提供了内置的`ObjectProxy`和`XML`类来处理这些数据结构。 三、客户端实现 1. **用户界面**:使用AS3的`Sprite`和`TextField`等组件...
function callLater(paramA, paramB, paramC) { // 使用函数表达式创建并返回一个匿名内部函数的引用 return function() { // 内部函数将被 setTimeout 函数执行,并能访问外部函数传递的参数 paramA[paramB] = ...
public function callLater(callback:function):void { // 某些异步操作完成后调用callback } callLater(function(event:Event):void { // 回调函数的实现 }); ``` 虽然这里没有明确声明接口,但`function(event:...
callLater(function() { console.log("Hello, world!"); }, 1000); ``` - **arguments对象**:在函数内部,`arguments`对象包含了所有传递给函数的参数,即使它们没有在函数签名中声明。 - **call和apply方法**...
根据给定的文件信息,以下是对“Flex试题.txt”中提到的关键知识点的详细解析: ### 1. Flex是什么? Flex是一种开源的软件框架,由Adobe Systems开发,用于构建跨平台的富互联网应用程序(RIA)。它使用MXML和...
对于异步操作,你可以使用`callLater`或`deferToThread`等Twisted的调度函数来处理消息的发送和接收。 txZMQ提供了一些高级接口,如`ZMQStream`,它允许开发者将ZeroMQ套接字与Twisted的I/O事件流相结合。这样,...
reactor.callLater(2, deferred.callback, inputData * 3) return deferred def cbPrintData(result): print('Result received:', result) deferred = getDummyData(3) deferred.addCallback(cbPrintData) ...
wxPython中有三个“线程安全”的函数:wx.PostEvent、wx.CallAfter和wx.CallLater。这三个函数在使用时可以保证GUI线程的稳定运行,避免因多线程操作而产生不可预知的错误。 wx.PostEvent允许你将一个事件对象放入...
Flex支持异步编程模型,如使用`AsyncToken`对象和`callLater()`方法,可以避免UI线程阻塞,确保等待界面的平滑显示。 5. **优化用户体验**: - **延迟显示**:不必要一开始就显示等待界面,只有当后台任务执行...
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...
为了解决这一问题,可以使用`mx.core.UIComponent.callLater()`函数将ActionScript的执行推迟到下一帧周期。 ### 三、类型声明优化字节码 类型声明在ActionScript 3中扮演着至关重要的角色。它不仅提高了代码的...
使用`reactor.callLater`可以设置一个延迟时间,在这个时间后执行`reactor.stop`来停止Reactor。然后调用`reactor.run`来启动Reactor循环,这样才能实际运行异步操作。 对于异步编程,还需要注意异常处理和资源管理...
reactor.callLater(1, self.processHeadline, input) # 延迟1秒后执行processHeadline self.d.addCallback(self._toHTML) # 成功后执行_toHTML return self.d # ...省略的代码... def printData(result): ...
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_...