2015-07-14 2 views
1

Я создаю глобальный загрузчик, который загружает разные SWF-файлы.
У меня нет доступа к детскому SWF-коду.
Я пытаюсь избежать ошибок ссылки на нулевой объект в коде внутри дочернего SWF, который может ссылаться на «этап» и т. Д.
Я добавил всех возможных прослушивателей событий, добавил try/catch, попробовал все перестановки applicationDomains и LoaderContexts , например:Избегайте ошибок ссылок на объекты в коде внутри дочернего SWF

applicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); 
var con:LoaderContext = new LoaderContext(false, applicationDomain); 
con.allowCodeImport = true; 
var _loader:Loader = new Loader(); 
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad); 
_loader.load(new URLRequest(fileName + ".swf"), con); 

Я просто не могу поймать ошибку или отключить/удалить код из такого SWF.
, например, следующий класс Main:

package { 

    import flash.display.MovieClip; 
    public class Main extends MovieClip { 

     public function Main() { 
      var h = this.stage.stageHeight; 
      trace(h); 
     } 
    } 
} 

раздавит любого SWF, который будет пытаться загрузить его как часть другого SWF.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main()

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

+1

Зачем нужны конструкторы со ссылками на 'stage'? что нецелесообразно в любом сценарии. Вы должны уловить ошибки асинхронно с событиями – BadFeelingAboutThis

+0

См. Этот вопрос: http://stackoverflow.com/questions/2228034/swfloader-can-i-catch-all-the-exceptions-from-the-loaded-swf – BadFeelingAboutThis

ответ

3

У вас есть доступ к коду в дочерних swf-файлах? Если это так, вы можете сделать что-то вроде этого:

package { 

    import flash.display.MovieClip; 
    public class Main extends MovieClip { 

     public function Main() { 
      if (stage) { 
       init(); 
      } 
      else { 
       addEventListener(Event.ADDED_TO_STAGE, init); 
      } 

     } 

     public function init(evt:Event = null):void { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      // You can now access the stage here 
     } 
    } 
} 

Это остановит инициализацию дочернего объекта до тех пор, пока не будет задана эталонная ссылка. Для всех дочерних объектов конструктор будет вызван первым до того, как будет установлен этап, поэтому вы не можете полагаться на его наличие в конструкторе.

+1

+1, в основном говоря: 'stage' не только' null' в конструкторе класса документа. Но поскольку вы никогда не знаете, используется ли этот класс в качестве класса документа (или используется как дочерний элемент), всегда следует учитывать, что «stage» недоступен в конструкторах и использовать предоставленный шаблон с «Event.ADDED_TO_STAGE» – null

+0

Привет, Jezzamon, Спасибо за ваш ответ. К сожалению, у меня нет доступа к дочерним swf-файлам. (Я обновил вопрос, чтобы было ясно) –

+0

@EliadBarazi Я не уверен, как это сделать. Вы не можете игнорировать ошибки, так как дочерний swf, вероятно, не будет работать, и вы не можете установить этап до того, как произойдет конструктор, потому что вам нужно вызвать конструктор, прежде чем вы сможете что-либо с ним сделать. – Jezzamon

Смежные вопросы