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);