【问题标题】:Flash local Shared Object not detecting changes by other SWF'sFlash 本地共享对象未检测到其他 SWF 的更改
【发布时间】:2012-06-17 21:48:01
【问题描述】:

我正在使用本地共享对象作为在同时运行的两个 swf 之间传输数据的方法。

so = getLocal("mySO");

// set the value from a user input, and set it to 'connected'
so.setProperty(txtName.text, "connected")

// every few seconds check if the other SWF started and modified value
onTimer 
{
 var data:Object = so.data
// breakpoint and inspect the data with debugger
}

最后一个注释行是问题所在。在调试器中,没有检测到对数据的更改,但是在使用 .minerva 检查 .sol 文件时,我看到了两个 SWF 的更改。因此,尽管 SWF 2 修改了共享对象,但 SWF 1 看不到这些更改。应该是这样吗?

ps:我知道我可以使用 LocalConnection 在两个正在运行的 SWF 之间进行通信,但如果存在某种限制,我仍然想了解 SO。

更新:

从磁盘运行编译的 Flex 应用程序两次,将“swf2”放入第二个的文本字段。两个都按开始。启动的第一个永远不会检测到第二个已连接。

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" 
               minHeight="600"
               creationComplete="application1_creationCompleteHandler(event)"
               >

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private var timer:Timer;
            private var so:SharedObject;

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                so = SharedObject.getLocal("mySO");

                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, onTimer);

            }

            protected function button1_clickHandler(event:MouseEvent):void
            {
                so.setProperty(txtSwf.text, 'connected');
                so.flush();
                timer.start();

            }


            protected function onTimer(event:TimerEvent):void
            {
                so = SharedObject.getLocal("mySO");
                txtLog.text += so.data["swf1"] + "\n";
                txtLog.text += so.data["swf2"] + "\n";
                txtLog.text += "------------ \n";

            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:TextInput id="txtSwf" x="10" y="50" text="swf1"/>
    <s:Button x="170" y="50" label="Start" click="button1_clickHandler(event)"/>
    <s:TextArea id="txtLog" x="10" y="154" width="279" height="112" />


</s:Application>

【问题讨论】:

  • LocalConnection 是更适合您的路线。除此之外,SWF 是否在同一个域中?
  • SWF 是从 IDE 运行的,一个是从带有 FP 的磁盘运行的,没有浏览器。他们都写信给SO,我证实了这一点。他们没有检测到其他人所做的更改。正如我所说,LC 是另一种选择,但我仍然想了解它为什么会这样。
  • 我相信从磁盘运行一个和从 IDE 运行一个不是同一个域。您必须从磁盘或浏览器全部运行它们。尝试将所有内容发布到网络上,看看是否能以这种方式获得所需的结果。
  • @The_asMan 我也尝试从磁盘运行两者。
  • 那么请尝试在同一个域的浏览器中同时运行两者。在浏览器中,我的意思是在具有域或至少一个 IP 地址的服务器上。在硬盘驱动器之外的浏览器中运行并不是我要说的。同时发布您的嵌入代码。

标签: actionscript-3 flash shared-objects


【解决方案1】:

你需要强制读取文件,而不是客户端已经拥有的数据:/

so = getLocal("mySO");

// set the value from a user input, and set it to 'connected'
so.setProperty(txtName.text, "connected")

// every few seconds check if the other SWF started and modified value
onTimer 
{
    so = getLocal("mySO"); // read the so file.

    var data:Object = so.data
}

【讨论】:

    【解决方案2】:

    呼,找到答案了。 Jevgeenij 引导我强制重新读取共享对象,但他的代码并不能完全正常工作。我需要补充的是这个。

    so = getLocal("mySO");
    
    // set the value from a user input, and set it to 'connected'
    so.setProperty(txtName.text, "connected")
    
    // every few seconds check if the other SWF started and modified value
    onTimer 
    {
        so = getLocal("mySO"); // read the so file.
    
        var data:Object = so.data;
    
        so = null // MAKE IT NULL AND HOPE IT'S GC'D BEFORE NEXT TIMER
    }
    

    诀窍是在使用后将其设置为 null,然后才强制重新读取它并拾取从其他 SWF 实例写入的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2017-04-08
      • 2012-08-05
      • 2011-02-05
      • 2021-06-17
      相关资源
      最近更新 更多