【问题标题】:Flash Player 10.1 crash on shared object accessFlash Player 10.1 在共享对象访问时崩溃
【发布时间】:2010-06-14 15:07:36
【问题描述】:

自从将我的 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。有没有其他人看过这个?

谢谢,西蒙

【问题讨论】:

  • 请尽快提交 Flash Player 错误:bugs.adobe.com
  • 你能提供一个错误报告的链接吗?在 Adob​​e 的 JIRA 上找不到。塔!
  • 我很乐意,但 Adob​​e 认为该错误报告对于公众(包括我...)来说过于机密
  • 有时崩溃可能是安全问题。因此,他们最初会在评估它们是否构成安全风险时隐藏这些类型的错误报告。
  • 我也看到了这个,除了 SharedObject.flush。我正在使用 Safari 5、OS X 10.6.3、SDK 4.0 和 FB 4。我的应用程序在启动时对 SharedObject.flush 进行了大约十二次调用,但只有少数调用使调试器停止。还没有找到模式。

标签: apache-flex flash


【解决方案1】:

我没有收到任何错误,flash 似乎运行了一个无限循环并导致我的浏览器崩溃。在 Safari 中运行良好,但在 Firefox 3.6.8 中运行良好。

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

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

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

【讨论】:

  • 这个错误不仅仅适用于 FF,我在 Safari 中也遇到了同样的问题,一个文件挂起(没有出现 flashplayer 错误,需要强制退出),另一个文件(具有相同的 html容器)没有。相当混乱,但在创建 So 后立即调用 mySo.flush() 可以解决问题。
【解决方案2】:

这里有一个解决方法:

    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]
        }
    }
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,并发现主要原因是 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】:

      升级到 FlashPlayer 10.1 后,我也被这个问题困扰。在我的机器上(Mac OS 10.6.4、Firefox 3.6.6、Flash Builder 4、Flex 3.2),没有报告堆栈跟踪...浏览器只是挂起。

      我能够通过确保每次修改SharedObject.data 对象的属性时调用SharedObject::flush() 来解决此问题:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-02
        • 2011-05-09
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多