Flash Player 10.1在共享对象访问时崩溃

时间:2010-06-14 15:07:36

标签: flex flash

自从我的Flash Player插件从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 Player保持静默。代码包含在try/catch(Error)块中,不会捕获此错误。我在Mac OS X 10.6.3上使用Flex SDK 3.5和Flex Builder 3。有没有人见过这个?

谢谢,西蒙

4 个答案:

答案 0 :(得分:4)

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

我通过执行以下操作修复了它:

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

我最好的猜测是,它正在尝试不断加载不存在的共享对象。

答案 1 :(得分:3)

这是一个解决方法:

    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 :(得分:1)

升级到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

我看到上面提到的一个评论者,它是挂起的,这是YMMV。

答案 3 :(得分:1)

我遇到了同样的问题,并且发现其主要原因是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];
   }

}