BulkLoaderにはまった --その1--
2008/03/12 17:44 更新
Google Codeより下記の内容について[http://code.google.com/p/bulk-loader/issues/detail?id=27&can=1&sort=-id:title=New Issues]したところ、addメソッドでロードしてしまうのはバグという事でfixされました。 ソッコーで対応してくれました! ありがたい事です。
t-matsuda氏から「BulkLoaderでgetMovieClipが動作しない!?」という質問があったので、動作検証を行おうとした時に、別の話ではまったのメモ。
以下、使用したBulkLoaderのリビジョンは180(2008/03/11現在の最新)です。
最初にgetMovieClipメソッドの検証を行おうと、下記のコード実行。
ソース抜粋
package { import flash.display.Sprite; import br.com.stimuli.loading.BulkLoader; import br.com.stimuli.loading.BulkProgressEvent; public class Base extends Sprite { public function Base():void { var bulkLoader:BulkLoader = new BulkLoader('Bulk'); bulkLoader.add('data.xml'); bulkLoader.add('cloud.swf'); bulkLoader.addEventListener(BulkLoader.COMPLETE, completeHandler); bulkLoader.start(); } private function completeHandler(e:BulkProgressEvent):void { var bulkLoader:BulkLoader = BulkLoader.getLoader('Bulk'); trace(bulkLoader.getXML('data.xml')); addChild(bulkLoader.getMovieClip('cloud.swf')); } } }
ただ単純に「cloud.swf」をロードしているだけです。
これを実行すると下記のエラーが発生。
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at Root()
ん??
この記事と少しエラーの内容が違うなぁ。。
まぁとりあえず、エラーが出たという事で下記のコードを実行。
ソース抜粋
package { import flash.display.Sprite; import br.com.stimuli.loading.BulkLoader; import br.com.stimuli.loading.BulkProgressEvent; public class Base extends Sprite { public function Base():void { var bulkLoader:BulkLoader = new BulkLoader('Bulk'); bulkLoader.add('data.xml'); // コメントアウト //bulkLoader.add('cloud.swf'); bulkLoader.addEventListener(BulkLoader.COMPLETE, completeHandler); bulkLoader.start(); } private function completeHandler(e:BulkProgressEvent):void { var bulkLoader:BulkLoader = BulkLoader.getLoader('Bulk'); trace(bulkLoader.getXML('data.xml')); // コメントアウト //addChild(bulkLoader.getMovieClip('cloud.swf')); } } }
XMLのみロードするように修正。
問題無くXMLがトレースされた。
という事で、次に下記のコードを実行。
ソース抜粋
package { import flash.display.Sprite; import br.com.stimuli.loading.BulkLoader; import br.com.stimuli.loading.BulkProgressEvent; public class Base extends Sprite { public function Base():void { var bulkLoader:BulkLoader = new BulkLoader('Bulk'); bulkLoader.add('cloud.swf'); // コメントアウト //bulkLoader.addEventListener(BulkLoader.COMPLETE, completeHandler); // コメントアウト //bulkLoader.start(); } private function completeHandler(e:BulkProgressEvent):void { var bulkLoader:BulkLoader = BulkLoader.getLoader('Bulk'); addChild(bulkLoader.getMovieClip('cloud.swf')); } } }
addして終了する何の意味もないコード。
これを実行すると・・またしても同じエラーが!!
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。 at Root()
なぜ!?!?!?
明らかにaddメソッドでロードしようとしてる・・
って事で、BulkLoaderのソースを追ってみた。
BulkLoader.asのソース抜粋
public function add(url : *, props : Object= null ) : LoadingItem { ・ ・ 省略 ・ item._addedTime = getTimer(); item._additionIndex = _additionIndex; // add a lower priority than default, else the event for all items complete will fire before // individual listerners attached to the item item.addEventListener(Event.COMPLETE, _onItemComplete, false, int.MIN_VALUE, true); item.addEventListener(ERROR, _onItemError, false, 0, true); item.addEventListener(Event.OPEN, _onItemStarted, false, 0, true); item.addEventListener(ProgressEvent.PROGRESS, _onProgress, false, 0, true); _items.push(item); _itemsTotal += 1; _totalWeight += item.weight; sortItemsByPriority(); _isFinished = false; if (!_isPaused){ /** addメソッドを呼び出すと、ここの_loadNextが実行され、実際にファイルをロードする。。 */ _loadNext(); } return item; }
完全にロードしてます。。
addメソッドで。。
と言う事は・・
ソース抜粋
package { import flash.display.Sprite; import br.com.stimuli.loading.BulkLoader; import br.com.stimuli.loading.BulkProgressEvent; public class Base extends Sprite { public function Base():void { var bulkLoader:BulkLoader = new BulkLoader('Bulk'); bulkLoader.addEventListener(BulkLoader.COMPLETE, completeHandler); bulkLoader.add('data.xml'); bulkLoader.add('1.jpg'); } private function completeHandler(e:BulkProgressEvent):void { var bulkLoader:BulkLoader = BulkLoader.getLoader('Bulk'); trace(bulkLoader.getXML('data.xml')); addChild(bulkLoader.getBitmap('1.jpg')); } } }
確かに・・XMLはトレースされ、画像も表示されました。。
BulkLoaderってaddメソッドでロードするんですね。。
addメソッドはただロード対象を登録するだけで、実際ロードするのはstartメソッドが呼び出されたタイミングなのかと思ってた。
完全にカルチャーショック!!
じゃぁ、startメソッドって何か意味があるのだろうか・・?
それともberianが何か大きな勘違いをしているのか??
不安だ。
誰か・・berianが間違ってるのかどうか、突っ込んでください!!