6

似乎如果 flash.net.NetConnection 被实例化并连接到 HTTP URL(例如 AMFPHP 网关),那么即使在关闭并且唯一引用设置为 null 之后,垃圾收集也不会拾取该实例。

另一方面,如果实例连接到 null(如用于播放视频/mp3 文件时所做的那样),则该实例将从内存清除。

为了澄清,以下连接将保留在内存中:

var stickyConn:NetConnection = new NetConnection();
stickyConn.connect("http://myserver/amfphp/gateway.php");
stickyConn.close();
stickyConn = null;

然而,以下连接将立即从内存中清除:

var tempConn:NetConnection = new NetConnection();
tempConn.connect(null);
tempConn.close();
tempConn = null;

我已经尝试过一些事情来解决这个问题:

  • 将客户端设置为空对象(因为客户端的默认值是 NetConnection 本身)
  • 在关闭连接之前,调用connect(null)
  • 关闭连接后,再次调用connect(null)并关闭它

有没有人遇到过这个问题?有针对这个的解决方法吗?

4

4 回答 4

0

我经常使用 AS3 构建重载 FLV/Mp4 播放器。当我使用 Akamai 或 Adob​​e 的内部 NetConnection 类等服务时,我始终牢记 client object

这是调用所有回调方法的 NetConnection 的属性。默认值为此 NetConnection 实例this。如果将客户端属性设置为另一个对象,则会在该对象上调用回调方法。

通过这种方式,您可以轻松了解垃圾收集从未以相同的方式真正应用于每个组件。所以,哪里stickyConn = null;只会停止播放,因为你从来没有声明过弱引用,垃圾收集不知道要寻找什么。

我已经根据特定玩家使用不同的方法取得了成功:

简单的陈述NetConnectionObj.client = this通常就足够了。但是,如果您的 NetConnection 被扩展或实现了一个接口呢?只需使用nullDictionary 对象: var d:Dictionary = new Dictionary(true); . 从这里垃圾收集将识别“d”作为弱引用并自动转储它;

因此,您的代码段看起来有点像这样:
var Dc:Dictionary = new Dictionary(true);
NetConnection:NetConnection.client = Dc;

或具有相同意图的一些变体。

我知道这行得通,所以如果您需要帮助,请联系...

于 2014-02-13T11:28:30.057 回答
0

I may have been vague with the last answer in regards to GC and Dictionary Objects. Please take this snippet into consideration. I wrote it quickly but I try to explain the Concept of what solves your problem; mainly since I have dealt with it before:

public class Main extends MovieClip {

    private var connection:NetConnection;
    private var __nData:*;
    private var _instance:*;
    private var _closure:Function;
    private var _D:Dictionary;

    public function Main() {    
        connection = new NetConnection();
        connection.addEventListener(NetStatusEvent.NET_STATUS, _nsHandle)
        connection.connect(null);
    }
    public function _nsHandle(event:NetStatusEvent):void {
        try {
            connection = new NetConnection();
            connection.connect(null);
            connection.client = RegisterForGC(event.target);
            RegisterForGC(connection);
        } finally {
            __nData = event.target.netConnection;
        }           
    }
    public function RegisterForGC(NCObject:*):* {
        _instance = NCObject;
        _closure  = function  ():void       {}
        _listener = function (e:Event):void {}
        _D = new Dictionary(true);
        _D[_listener] = "A";
        _D[_instance] = "B";
        _D[_closure]  = "C";
        try {
            new LocalConnection().connect( "A" );
            new LocalConnection().connect( "B" );
        } catch (anything:*) { }
        return _instance;
    }
}
于 2014-02-14T03:33:45.197 回答
0

我不确定,但您的示例似乎表明您在舞台/框架上声明您的变量。

关(); 这就是你需要的全部工作但是......从我发现的 NetConnection 出于某种原因,除非所有变量/函数都在外部类中声明,例如。public vars public 函数,即使在使用 close() 后它也会保留在内存中;

拔出我的头发,用一个音频流项目来解决这个问题。但是,一旦我将所有编码移至外部类, close(); 实际上关闭了连接。

如果您的代码在舞台上的框架上或在 MC 中,我将创建一个类并在所述 External Class.as 中声明变量和函数,并且由于某些愚蠢的原因它可以工作。

希望这可以帮助。

于 2016-05-02T18:57:36.287 回答
-1

您是否在使用 NetStream 对象并且在完成后不处理它?我之所以这么问,是因为我很少看到后面没有 NetStream 对象的 NetConnection。

于 2013-02-14T22:08:20.993 回答