就在刚才,发生了一个非常奇怪的BUG,我在调用SharedObject.flush的时候,按照官方文档上的说明,如果存储空间不够了,会弹出一个对话框提示用户进行授权,如下图:

ESL监听注册事件 as监听事件_写入文件


当用户点击允许或者拒绝的时候,会派发NetStatusEvent事件,可诡异的是并没有监听到这个事件。不管点允许还是拒绝,死活执行不到监听方法。

官方关于SharedObject.flush的说明文档:

  • 将本地永久共享对象立即写入本地文件。如果不使用此方法,则 Flash Player 会在共享对象会话结束时(也就是说,在 SWF 文件关闭时,在由于不再有对共享对象的任何引用而将其作为垃圾回收时,或者在调用 SharedObject.clear() 或 SharedObject.close() 时),将共享对象写入文件。
    如果此方法返回 SharedObjectFlushStatus.PENDING,则 Flash Player 将显示一个对话框,要求用户增加磁盘空间量以供此域中的对象使用。若要允许将来保存共享对象时其空间能够增长,从而避免返回值 PENDING,请为 minDiskSpace 传递一个值。当 Flash Player 尝试写入文件时,它将查找传递给 minDiskSpace 的字节数,而不是查找足够的空间以共享对象的当前大小来保存共享对象。
    例如,如果预期共享对象增长到最大为 500 个字节,则即使它开始时要小得多,也为 minDiskSpace 传递 500。如果 Flash 要求用户为该共享对象分配磁盘空间,它将要求 500 个字节。在用户分配了请求的空间量之后,当以后尝试对齐该对象时(只要其大小不超过 500 个字节),Flash 将无需要求更多的空间。
    在用户响应此对话框后,则会再次调用此方法。将调度 code 属性值为 SharedObject.Flush.Success 或 SharedObject.Flush.Failed 的 netStatus 事件。

API文档最底下附有一份测试代码,我测试过,确实能监听到这个事件,可是我自己的代码为什么就监听不到呢?附上我自己的测试代码:


public function testSharedObj():void
{
    try
    {
        var so:SharedObject = SharedObject.getLocal('test', '/');
        so.data['test'] = 10000000000;
        var flushStatus:String = so.flush(10000000000);
        switch (flushStatus) {
            case SharedObjectFlushStatus.PENDING:
                trace("Requesting permission to save object...");
                so.addEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
                break;
            case SharedObjectFlushStatus.FLUSHED:
                trace("Value flushed to disk.");
                break;
        }
        function onFlushStatus(event:NetStatusEvent):void {
            trace("User closed permission dialog...");
            switch (event.info.code) {
                case "SharedObject.Flush.Success":
                    trace("User granted permission -- value saved.\n");
                    break;
                case "SharedObject.Flush.Failed":
                    trace("User denied permission -- value not saved.\n");
                    break;
            }
            
            so.removeEventListener(NetStatusEvent.NET_STATUS, onFlushStatus);
        }
    } 
    catch(error:Error) 
    {
        trace("Error...Could not write SharedObject to disk");
    }
}


Google了一下‘NetStatusEvent.NET_STATUS 失效’,找到一篇文章:远程共享对象(sharedObject)的研究心得再对照了一下自己代码和官方的代码,发现有不同的地方是我的SharedObject是一个局部变量。
附文中的原话:注:这里的so必须有一个额外的强引用(全局或者其他方式存着),有趣的是仅仅这个强监听不能保证这种强引用!丫的会莫名其妙的失效!
修改了一下代码,把so定义为一个成员变量,果然正常的看到打印了!

as3的闭包好用,不过从最开始用到现在已经出过不少问题了,搞得现在用这东西有点心惊胆颤,怕一个用不好就出了莫名其妙的问题,查也无从查起,能少用就尽量少用吧。
不过这东西确实好用啊!