![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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的步骤
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的步骤
最初的版本在使用时一直出现内存泄露的问题,对as3不熟,搞了很久才解决。
参考资料:
http://www.SnowManBlog.com
http://www.roading.net