флеш AS3 как мне удалить слушатели событий сцены - PullRequest
1 голос
/ 25 февраля 2009

Я строю анимацию во flash и as3, у меня есть функция, в которую я добавляю сцену eventListener, stage.addEventListener (Event.ENTER_FRAME, setScrollPercent, false, 0, true);

Поскольку это событие устанавливается внутри функции функции, «две функции в глубину», как я могу сбросить все прослушиватели событий стадии извне функций без получения ошибки?

Ответы [ 4 ]

5 голосов
/ 25 февраля 2009

Лучшие практики использования списков событий AS:

  • Сделайте его слабым (как вы сделали, последний параметр addEventListener)
  • Установите обработчик событий на нуль после обработки (строго говоря, не требуется, если вы установили его как слабый)

Flex не дает вам деструкторов. У него есть собственный сборщик мусора, который работает за кулисами и управляет памятью. Он очищает часть памяти, если на нее нет ссылок. Ну, сильные ссылки. Все объекты по умолчанию имеют строгую ссылку. Обработчики событий, поскольку они, как правило, являются узким местом в производительности, обладают этой особой способностью объявлять себя слабой - слабой ссылкой. Это, конечно, возможно, только когда вы присоединяете обработчики событий с помощью функции addEventHandler(). Слабые ссылки не принимаются во внимание GC и, следовательно, когда все сильные ссылки исчезнут, они будут автоматически собраны мусором, освобождая вас от необходимости делать =null вручную. Что бы вы не делали, если не указали параметр. По умолчанию даже обработчики создаются как строгие ссылки.

Однако, отмечая их слабыми, имеет побочный эффект. Они могут раствориться в воздухе, даже если вы об этом не узнаете. В конце концов, вы будете знать, но с точки зрения неприятной ошибки. Это то, что вызывает ваши проблемы? Может быть, может быть нет. Вам придется экспериментировать. Кроме того, будет полезно, если вы предоставите нам более подробную информацию, такую ​​как точный код ошибки, источник.

Надеюсь, это поможет. Удачного сгибания:)

1 голос
/ 25 февраля 2009

Какие ошибки вы видите? Уровень вложенности не должен иметь к этому никакого отношения, так как слушатели просто регистрируются параметрами, поэтому, пока вы вызываете remove с теми же тремя ключевыми параметрами, которые вы использовали для добавления, все будет в порядке.

Является ли ваш реальный вопрос, как получить ссылку на объект слушателя за пределами области видимости? Если это так, есть несколько возможных решений, и лучший способ сделать это зависит от структуры вашего кода.

- MarkusQ

0 голосов
/ 08 января 2013

Вы должны иметь возможность просто использовать старую функцию и использовать removeEventListeners вместо add. На самом деле довольно просто.

0 голосов
/ 04 марта 2009

Ответ на ваш вопрос, и я понимаю, что у вас были проблемы с областью действия, потому что я только что ответил на вопрос, который у вас был по поводу области видимости, это то, что вы работаете со сценой. Считайте сцену глобальной, так как это холст, на котором рисуются все ваши экранные объекты.

Следующее будет работать где угодно !!!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true);

Теперь ошибка, о которой вы говорите, IM GUESSING, заключается в том, что вы просто установили вышеприведенное значение на removeEventListener, когда будете готовы, что не будет работать.

Функция removeEventListener НЕ принимает пять параметров, таких как ее родственный метод addEventListener, она позволяет только три игнорировать приоритет и слабую ссылку, как показано ниже.

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope.
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false);

надеюсь, что это поможет, помните, что стадия в некотором смысле является глобальным корнем, и будьте осторожны с корнем, он на самом деле работает так, как это должно быть сейчас, в том факте, что вызов корня теперь относится к swf, из которого вы его вызываете, не стадия, если стадия не является корнем текущей области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...