4

次のコードをチェックして、何が印刷されると期待しているか教えてください。次に、それを実行して、実際に何が起こっているかを確認します。

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class TestFlashEvents extends Sprite
    {
        private static const DUMMY_EVENT:String = "DummyEvent";
        private var dummyObjects:Vector.<DummyObject> = new Vector.<DummyObject>(100);
        public function TestFlashEvents()
        {
            for(var i:int = 0; i < dummyObjects.length; i++){
                dummyObjects[i] = new DummyObject(this);
                addEventListener(DUMMY_EVENT, dummyObjects[i].listener);
            }
            removeEventListener(DUMMY_EVENT, dummyObjects[41].listener);
            dispatchEvent(new Event(DUMMY_EVENT));
        }

        private var counter:int = 0;
        public function onGettingEvent(dummyObject:DummyObject):void{
            if(counter == 25){
                for(var i:int = 0; i < 50; i++){
                    removeEventListener(DUMMY_EVENT, dummyObjects[i].listener);
                    trace("Removing", dummyObjects[i].id);
                }
            }
            trace("Handeling event", counter, dummyObject.id);
            counter++;
        }
    }
}
import flash.events.Event;

class DummyObject
{
    private static var dummyObjectsCounter:int = 0;

    public var id:String;
    private var tester:TestFlashEvents;

    public function DummyObject(tester:TestFlashEvents)
    {
        this.tester = tester;
        id = "DummyObject " + dummyObjectsCounter;
        dummyObjectsCounter++;
    }

    public function listener(event:Event):void{
        tester.onGettingEvent(this);
    }
}

removeEventListener機能は実際には機能していません。それについてどう思うか教えてください。また、アドビでバグを開きます。

4

2 に答える 2

2

このコードは、実際にイベント リスナーを呼び出す前に、アドビがイベント リスナー リストをキャッシュすることを意味します。1 つのオブジェクトに対して 1 つの特定のイベントに対して 2 つのリスナーを使用するのは異常な動作ですが、その場合、アドビは、このリストを実際に変更する前にすべてのリスナーを呼び出す必要があると想定しました。実際には、99 人のリスナー全員が呼び出されることを期待していました。1 つのイベントの処理中にイベント リスナー リストを再レンダリングすると、Flash に過度の負荷がかかり、ラグが大量に発生するため、この動作は設計上のものである可能性もあります。誰もラグを望んでいません。

于 2012-11-28T09:35:34.980 に答える
0

これは、イベント リスナーを優先することで簡単に修正できます。これは Flash のバグではなく、遅延を防ぐためのイベント リスナーのキャッシングについて Vesper が述べたように、バグです。

これがあなたのコードの更新版ですaddEventListener。呼び出しの優先順位をマークしてください。

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class TestFlashEvents extends Sprite
    {
        private var _this = this;
        private static const DUMMY_EVENT:String = "DummyEvent";
        private var dummyObjects:Vector.<DummyObject> = new Vector.<DummyObject>(100);
        public function TestFlashEvents()
        {
            for(var i:int = 0; i < dummyObjects.length; i++)
            {
                dummyObjects[i] = new DummyObject(this);
                addEventListener(DUMMY_EVENT, dummyObjects[i].listener, false, dummyObjects.length - i);
            }
            removeEventListener(DUMMY_EVENT, dummyObjects[41].listener);
            dispatchEvent(new Event(DUMMY_EVENT));
        }

        private var counter:int = 0;
        public function onGettingEvent(dummyObject:DummyObject):void
        {
            if (counter == 25)
            {
                for (var i:int = 0; i < 50; i++)
                {
                    removeEventListener(DUMMY_EVENT, dummyObjects[i].listener);
                    trace("Removing", dummyObjects[i].id);
                }
            }
            trace("Handeling event", counter, dummyObject.id);
            counter++;
        }
    }
}

import flash.events.Event;

class DummyObject
{
    private static var dummyObjectsCounter:int = 0;

    public var id:String;
    private var tester:TestFlashEvents;

    public function DummyObject(tester:TestFlashEvents)
    {
        this.tester = tester;
        id = "DummyObject " + dummyObjectsCounter;
        dummyObjectsCounter++;
    }

    public function listener(event:Event):void{
        tester.onGettingEvent(this);
    }
}
于 2012-12-06T10:18:59.630 に答える