自从我的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。有没有人见过这个?
谢谢,西蒙
答案 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];
}
}