AS3内存回收---FLASH AS3 WebService最终确认版
之前修改的WebService通讯包(
http://hi.baidu.com/alby/blog/item/987f90524d01900d0cf3e3d4.html
)老是出现内存泄漏,目前版本可以解决~!
-------------------------------------------------------------------------------------------
MyWebService.as
package {
import flash.net.*;
import flash.events.*;
public class MyWebService extends EventDispatcher {
private var wsUrl:String;
private var targetmethodName:String;
public function MyWebService(url:String):void {
wsUrl = url;
}
public function load(methodName:String, ...args):void {
//trace(methodName);
targetmethodName = methodName;
var param:String="";
//trace(args.length)
for (var i:int = 0; i<args.length; i++) {
if (param!="") {
param += "&"+args[i];
} else {
param = args[i];
}
}
//trace("param::"+param);
var urlLoader:URLLoader = new URLLoader();
var urlRequest:URLRequest = new URLRequest();
urlLoader.addEventListener("complete", completeHandler);
urlLoader.addEventListener("ioError", ioerrorHandler);
urlRequest.url = wsUrl + "/" + methodName;
urlRequest.method = URLRequestMethod.POST;
urlRequest.requestHeaders.push(new URLRequestHeader("Content-Type", "application/x-www-form-urlencoded"));
urlRequest.data = param;
urlLoader.load(urlRequest);
//args = null;
//MyGC.GC();
}
private function completeHandler(e:Event):void {
e.target.removeEventListener("complete", completeHandler);
e.target.removeEventListener("ioError", ioerrorHandler);
//urlLoader = null;
//urlRequest = null;
//MyGC.GC();
//trace(XML(e.target.data).toString());
MyGC.GC();
dispatchEvent(new MyEventer("callComplete", {method:targetmethodName,data:e.target.data}));
}
private function ioerrorHandler(e:IOErrorEvent):void {
e.target.removeEventListener("complete", completeHandler);
e.target.removeEventListener("ioError", ioerrorHandler);
//urlLoader = null;
MyGC.GC();
//urlRequest = null;
//MyGC.GC();
//trace(e)
dispatchEvent(new MyEventer("callError", {method:targetmethodName,data:null}));
}
}
}
import flash.events.*;
import flash.net.*;
class MyEventer extends Event {
private var info:Object;
public function MyEventer(type:String, info:Object, bubbles:Boolean = false, cancelable:Boolean = false):void {
super(type, bubbles, cancelable);
this.info = info;
}
public function get eventInfo():Object {
return this.info;
}
public function MyEventerGC():void {
this.info = null;
MyGC.GC();
}
public override function toString():String {
return formatToString("Event:","type","bubbles","cancelable","eventInfo");
}
}
-------------------------------------------------------------------------------------------
package
{
import flash.net.LocalConnection;
//import flash.system.System;
public class MyGC
{
public static function GC()
{
//trace("内存begin:"+System.totalMemory);
try {
new LocalConnection().connect('foo');
new LocalConnection().connect('foo');
} catch (e:*) {}
//trace("内存 end:"+System.totalMemory);
}
}
}
-------------------------------------------------------------------------------------------
调用方法:
var ws = new WebServices("http://192.168.1.7/webservice/Test.asmx");
ws.addEventListener("callComplete", wsCompleteHandler);
ws.addEventListener("callError", wsIOErrorHandler);
function wsIOErrorHandler(e):void{
trace(e.eventInfo.method)
e.MyEventerGC();
}
function wsCompleteHandler(e):void{
//trace("--------------------")
//trace(e.eventInfo.method)
//trace(e.eventInfo.data)
//trace("--------------------")
var listXML:XML = XML(e.eventInfo.data);
trace(listXML)
e.MyEventerGC();
}
ws.load("方法名","参数1=参数1的值","参数2=参数2的值");
//之所以用"参数1=参数1的值"的格式是为了省略分析WebService的步骤