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

 

posted @ 2010-07-15 15:59  rob_2010  阅读(374)  评论(0编辑  收藏  举报