Flex中RemoteObject使用注意事项

       最近在使用FLEX进行产品过程中,遇到这样一个BUG:一个远程调用的返回结果,被两个方法处理了。经过不断调试后发现,在整个应用的代码中,使用了RemoteObject单实例模式,但由于产品功需要,对同一个远程方法在不同的代码中,又需要进行不同的处理,分别定义了AbstractOperation、添加不同的监听,例如:

       在A.as中,对远程方法OPER_SEARCH_CURRENT_ALERT定义了如下监听:
var operGetActiveAlert:AbstractOperation=RPCService.getInstance().getAlertService().getOperation(RPCService.OPER_SEARCH_CURRENT_ALERT);
operGetActiveAlert.addEventListener(ResultEvent.RESULT, getActiveAlertResultHandler);

       在B.as中,对相同的远程方法定义了如下监听:

var operGetMoreAlert:AbstractOperation=RPCService.getInstance().getAlertService().getOperation(RPCService.OPER_SEARCH_CURRENT_ALERT);
operGetMoreAlert.addEventListener(ResultEvent.RESULT, getMoreAlert);

       此时,如果执行了B.as中的远程方法时,返回的结果就会被A.as和B.as两个返回监听都处理。通过查看RemoteObject的getOperation方法源代码,发现对于同一个RemoteObject,在调用getOperation的时候,会在缓存中查找是否已经存在相同方法名的AbstractOperation实例,如果存在,返回缓存的,如果不存在,重新实例化一个。到此,问题基本明了了,其实A.as和B.as中的AbstractOperation实例是同一个实例,在同一个实例上添加了两次监听,导致返回结果被两个方法处理了。

        此问题解决方法比较简单,在B.as中,重新实例一个RemoteObject对象即可,如下:
var alertService:RemoteObject=new RemoteObject(RPCService.FAULT_SERVICE_NAME);
alertService.channelSet=RPCService.getInstance().channelSet;
var operGetMoreAlert:AbstractOperation=alertService.getOperation(RPCService.OPER_SEARCH_CURRENT_ALERT);
operGetMoreAlert.addEventListener(ResultEvent.RESULT, getMoreAlert);

 

posted @ 2013-01-18 17:38  小小有  阅读(796)  评论(0编辑  收藏  举报