Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java flash.display.Loader间歇性地导致加载swf的子项为松散类型_Java_Actionscript 3_Flash_Actionscript_Loader - Fatal编程技术网

Java flash.display.Loader间歇性地导致加载swf的子项为松散类型

Java flash.display.Loader间歇性地导致加载swf的子项为松散类型,java,actionscript-3,flash,actionscript,loader,Java,Actionscript 3,Flash,Actionscript,Loader,我有一个类,它使用与此类似的两个加载程序加载两个SWF(注意新的ApplicationDomain): 加载的主权财富基金实际上是工厂: public class Child1Factory extends Sprite { public function Child1Factory() {} public function getChild1():Child1 { return new Child1() } } 加载两个SWF后,我将child1

我有一个类,它使用与此类似的两个加载程序加载两个SWF(注意新的ApplicationDomain):

加载的主权财富基金实际上是工厂:

public class Child1Factory extends Sprite
{

    public function Child1Factory() {}

    public function getChild1():Child1 {
        return new Child1()
    }

}
加载两个SWF后,我将child1和child2添加到舞台,如下所示:

var child1:MovieClip = child1Factory.getChild1()
var child2:MovieClip = child2Factory.getChild2()
addChild(child1)
addChild(child2)
Child1和child2看起来非常相似,但不完全相同。Child1如下所示(注意添加到\u-STAGE-listener中):

更新2 好吧,这变得更奇怪了。在@DavidMear之后,我对其进行了更新,以便将孩子们添加到onChildXComplete函数中,突然间,它中断的频率大大降低。尽管如此,它仍然偶尔会断裂:

public class Main extends Sprite 
{
    private var child1Factory:Object;
    private var child1Loaded:Boolean = false;
    private var child2Factory:Object;
    private var child2Loaded:Boolean = false;

    public function Main():void 
    {
        Security.allowDomain("*")
        if (stage) loadChildren();
        else addEventListener(Event.ADDED_TO_STAGE, loadChildren);
    }

    private function loadChildren(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, loadChildren);

        child1Loaded = false
        child2Loaded = false

        var child1Loader:Loader = new Loader()
        child1Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild1Complete)
        child1Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child1Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))

        var child2Loader:Loader = new Loader()
        child2Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild2Complete)
        child2Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child2Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))


    }

    private function onChild1Complete(e:Event):void {
        child1Factory = e.currentTarget.content
        child1Loaded = true
        var child1:MovieClip = child1Factory.getChild1()
        addChild(child1)
        if (child2Loaded) {
            onLoadComplete()
        }   

    }

    private function onChild2Complete(e:Event):void {
        child2Factory = e.currentTarget.content
        child2Loaded = true
        var child2:MovieClip = child2Factory.getChild2()
        addChild(child2)
        if (child1Loaded) {
            onLoadComplete()
        }

    }

    private function onLoadComplete():void {
        loadChildren(null)
    }

}
更新3

这段代码抛出错误的频率与原始区域和堆栈跟踪指向其中一个计时器处理程序的频率大致相同。如果没有堆栈跟踪指向onLoadComplete的计时器,它也会抛出错误。。。i、 e.在抛出错误之前,测试函数已在onChildXComplete函数中成功运行一次。现在我真的很困惑

public class Main extends Sprite 
{
    private var child1Factory:Object;
    private var child1Loaded:Boolean = false;
    private var child2Factory:Object;
    private var child2Loaded:Boolean = false;

    public function Main():void 
    {
        Security.allowDomain("*")
        if (stage) loadChildren();
        else addEventListener(Event.ADDED_TO_STAGE, loadChildren);
    }

    private function loadChildren(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, loadChildren);

        child1Loaded = false
        child2Loaded = false

        var child1Loader:Loader = new Loader()
        child1Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild1Complete)
        child1Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child1Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))

        var child2Loader:Loader = new Loader()
        child2Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild2Complete)
        child2Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child2Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))


    }

    private function onChild1Complete(e:Event):void {
        child1Factory = e.currentTarget.content
        child1Loaded = true
        var child1:MovieClip = child1Factory.getChild1()
        addChild(child1)
        if (child2Loaded) {
            onLoadComplete()
        }   

    }

    private function onChild2Complete(e:Event):void {
        child2Factory = e.currentTarget.content
        child2Loaded = true
        var child2:MovieClip = child2Factory.getChild2()
        addChild(child2)
        if (child1Loaded) {
            onLoadComplete()
        }

    }

    private function onLoadComplete():void {

        var timer1:Timer = new Timer(500, 1) 
        timer1.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void {
            var child1:MovieClip = child1Factory.getChild1()
            addChild(child1)
        })
        timer1.start()

        var timer2:Timer = new Timer(1000, 1) 
        timer2.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void {
            var child2:MovieClip = child2Factory.getChild2()
            addChild(child2)
            loadChildren(null)
        })
        timer2.start()          

    }

}

我认为递归调用findChildrenOfType方法可能不太合适,因为每次调用都要重置toReturn数组。也许像这样的事情会更好

function findChildrenOfType(type:Class, container:DisplayObjectContainer, toReturn:Array = null ):Array {
    if(!toReturn) toReturn = [];
    for (var childIndex:int = 0; childIndex < container.numChildren; childIndex++) {
        var child:DisplayObject = container.getChildAt(childIndex)
        if (child is type) {
            toReturn.push(child);
        } else if (child is DisplayObjectContainer) {
            findChildrenOfType( type, child as DisplayObjectContainer, toReturn );
        }
    }
    return toReturn;
}
函数findChildrenOfType(类型:Class,容器:DisplayObjectContainer,toreReturn:Array=null):数组{
如果(!toReturn)toReturn=[];
for(var childIndex:int=0;childIndex
这种情况是间歇性发生的,而且只有在通过网络加载时才会发生,这让我怀疑这与测试运行的时间有关。在swf完全加载之前,可能会将
Child1
添加到该阶段,因此在
onchild1 complete
上运行测试是否会产生影响?谢谢@DavidMear的回复。我已经用loader类的完整代码更新了这个问题。在调用onChild1Complete之前,不应将Child1添加到阶段。我试着明确地分开测试,但不幸的是没有乐趣。不过我很同意你的看法。它看起来好像没有满载。还有什么我可以听的吗?嗨@DavidMear。你能看看我上面的第二次更新吗。越来越奇怪了。您希望它的行为会有所不同吗?我现在将Original与update 2组合在一起,以便在onChild1Complete/onChild2Complete上添加child1/child2,然后在LoadComplete上再次添加它们。发生错误,堆栈跟踪指向onLoadComplete函数。非常奇怪,因为对我来说,这意味着调用onChildXComplete时它已经正常工作了一次,所以它必须正确加载。我很困惑。你们认为我应该向Adobe提交一份bug报告吗?哇,更新2似乎令人鼓舞,但更新3却让我难堪。我自己复制了您的最新设置,并且我可以确认,当从服务器加载时,每隔5次左右尝试一次,就可以从计时器中看到错误。可能值得提交一份带有zip文件的bug报告以进行测试。我会再做一点,但希望其他人能有个主意。谢谢你花时间看这个@Dezza。我很确定原始函数可以正常工作。就像我说的,它只是偶尔断裂。从外观上看,您的函数也可以工作,并且两者都做相同的事情。在我的函数中,不需要保留数组。每次调用函数时,它都是一个不同的数组。结果数组是连接在一起的。如果子类单独工作,或者只加载了其中一个,或者从同一台计算机上加载,则子类可以完美地工作。即使它们都是从另一台计算机加载的,它们也会工作很多时间。这是一个不一致的错误,所以我很确定逻辑本身没有任何问题。
public class Main extends Sprite 
{
    private var child1Factory:Object;
    private var child1Loaded:Boolean = false;
    private var child2Factory:Object;
    private var child2Loaded:Boolean = false;

    public function Main():void 
    {
        Security.allowDomain("*")
        if (stage) loadChildren();
        else addEventListener(Event.ADDED_TO_STAGE, loadChildren);
    }

    private function loadChildren(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, loadChildren);

        child1Loaded = false
        child2Loaded = false

        var child1Loader:Loader = new Loader()
        child1Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild1Complete)
        child1Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child1Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))

        var child2Loader:Loader = new Loader()
        child2Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild2Complete)
        child2Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child2Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))


    }

    private function onChild1Complete(e:Event):void {
        child1Factory = e.currentTarget.content
        child1Loaded = true
        var child1:MovieClip = child1Factory.getChild1()
        addChild(child1)
        if (child2Loaded) {
            onLoadComplete()
        }   

    }

    private function onChild2Complete(e:Event):void {
        child2Factory = e.currentTarget.content
        child2Loaded = true
        var child2:MovieClip = child2Factory.getChild2()
        addChild(child2)
        if (child1Loaded) {
            onLoadComplete()
        }

    }

    private function onLoadComplete():void {
        loadChildren(null)
    }

}
public class Main extends Sprite 
{
    private var child1Factory:Object;
    private var child1Loaded:Boolean = false;
    private var child2Factory:Object;
    private var child2Loaded:Boolean = false;

    public function Main():void 
    {
        Security.allowDomain("*")
        if (stage) loadChildren();
        else addEventListener(Event.ADDED_TO_STAGE, loadChildren);
    }

    private function loadChildren(e:Event = null):void 
    {
        removeEventListener(Event.ADDED_TO_STAGE, loadChildren);

        child1Loaded = false
        child2Loaded = false

        var child1Loader:Loader = new Loader()
        child1Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild1Complete)
        child1Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child1Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))

        var child2Loader:Loader = new Loader()
        child2Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onChild2Complete)
        child2Loader.load(new URLRequest("http://mywebsite.com/assets/load_test/Child2Factory.swf?" + Math.random()), new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain)))


    }

    private function onChild1Complete(e:Event):void {
        child1Factory = e.currentTarget.content
        child1Loaded = true
        var child1:MovieClip = child1Factory.getChild1()
        addChild(child1)
        if (child2Loaded) {
            onLoadComplete()
        }   

    }

    private function onChild2Complete(e:Event):void {
        child2Factory = e.currentTarget.content
        child2Loaded = true
        var child2:MovieClip = child2Factory.getChild2()
        addChild(child2)
        if (child1Loaded) {
            onLoadComplete()
        }

    }

    private function onLoadComplete():void {

        var timer1:Timer = new Timer(500, 1) 
        timer1.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void {
            var child1:MovieClip = child1Factory.getChild1()
            addChild(child1)
        })
        timer1.start()

        var timer2:Timer = new Timer(1000, 1) 
        timer2.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent):void {
            var child2:MovieClip = child2Factory.getChild2()
            addChild(child2)
            loadChildren(null)
        })
        timer2.start()          

    }

}
function findChildrenOfType(type:Class, container:DisplayObjectContainer, toReturn:Array = null ):Array {
    if(!toReturn) toReturn = [];
    for (var childIndex:int = 0; childIndex < container.numChildren; childIndex++) {
        var child:DisplayObject = container.getChildAt(childIndex)
        if (child is type) {
            toReturn.push(child);
        } else if (child is DisplayObjectContainer) {
            findChildrenOfType( type, child as DisplayObjectContainer, toReturn );
        }
    }
    return toReturn;
}