代码之家  ›  专栏  ›  技术社区  ›  Simon

Flash播放器10.1共享对象访问崩溃

  •  1
  • Simon  · 技术社区  · 14 年前

    自从我的Flash播放器插件从10更新到10.1后,我看到访问共享对象时发生了奇怪的崩溃。Flex Builder的调试器弹出并打印如下堆栈跟踪:

    undefined
    
     at flash.net::SharedObject$/getLocal()
     at my.code::MyClass$/load()[/my/path/to/my/MyClass.as:27]
        (...)
    

    打电话时会发生这种情况 SharedObject.getLocal("someString") 对于 第二次 对于同一个字符串,尽管它并不总是崩溃。在同一台计算机上使用另一个浏览器(在flex builder中未配置为首选调试浏览器)时,Flash播放器保持静音。代码被包装在 try/catch(Error) 不捕获此错误的块。我在Mac OS X 10.6.3上使用了flex sdk 3.5和flex builder 3。还有人看到这个吗?

    谢谢,西蒙

    4 回复  |  直到 12 年前
        1
  •  3
  •   Guillaume Malartre    14 年前

    这是一个解决办法:

        package scolab.core
    {
        import flash.net.SharedObject;
    
        /**
         * Flash 10.1 introduce a nasty bug that crash the FlashPlayer and the browser when a SharedObject is accessed consecutively
         * We work around this issue with a static accessor that make sure the SharedObject is accessed only once and kept in cache.
         * */
        public class SharedObjectManager
        { 
            private static var cache:Object = new Object()
            public static function getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject {
                if (cache.hasOwnProperty(name+":"+localPath+":"+secure)) {
                    return cache[name+":"+localPath+":"+secure]
                } else {
                    cache[name+":"+localPath+":"+secure] = SharedObject.getLocal(name,localPath,secure)
                }
                return cache[name+":"+localPath+":"+secure]
            }
        }
    }
    
        2
  •  4
  •   Maxsquatch    14 年前

    我没有收到任何错误,flash只是运行了一个无限循环,使我的浏览器崩溃。在Safari中可以正常工作,但在Firefox 3.6.8中不行。

    我通过以下步骤修复了它:

    var mySO:SharedObject = SharedObject.getLocal("mySO");
    mySO.flush();      // Fixes Firefox shared object bug
    

    我的最佳猜测是,它试图不断地加载一个不存在的共享对象。

        3
  •  1
  •   deadrunk NebojÅ¡a Stojković    12 年前

    我也遇到了同样的问题,并找出了主要的原因是使用相同的名称来乘以lso。只需确保只有一个具有特定名称的sharedObject实例。

    public class LsoManager
    {
       private static var _collection:Dictionary = new Dictionary();
       private static const LSO_LOCAL_PATH:String  = "/";
       private static const LSO_USE_SECURE:Boolean = false;
    
       public function LsoManager() 
       {}
    
       public static function get(key:String):SharedObject
       {
            if (!_collection.hasOwnProperty(key)) {
                _collection[key] = SharedObject.getLocal(key, LSO_LOCAL_PATH, LSO_USE_SECURE);
            }
            return _collection[key];
       }
    
    }
    
        4
  •  1
  •   deadrunk NebojÅ¡a Stojković    12 年前

    升级到FlashPlayer 10.1时,我也被这个问题烧死了。在我的机器上(Mac OS 10.6.4、Firefox 3.6.6、Flash Builder 4、Flex 3.2),没有报告堆栈跟踪…浏览器刚刚挂起。

    我打电话来解决这个问题 SharedObject::flush() 每一次我 被改进的 的属性 SharedObject.data 对象:

    var so:SharedObject = SharedObject.getLocal("blah");
    
    so.data.something = "abcdef";
    
    // not so.data.flush() - there is no such method
    so.flush();    // this fixed my problem on FlashPlayer 10.1
    

    我看到上面的一个评论说,挂在上面的是flush调用本身,所以ymmv。

    推荐文章