FLASH AS3 WebService

代码
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的步骤

最初的版本在使用时一直出现内存泄露的问题,对as3不熟,搞了很久才解决。

参考资料:

http://www.SnowManBlog.com

http://www.roading.net

posted @ 2010-01-08 17:09  alby  阅读(598)  评论(0编辑  收藏  举报