- ベストアンサー
AS3 Flash外部テキストの取得
- AS3で外部テキストの取得をしているが、うまくいかない。
- init02()メソッドは2秒おきにタイマーで呼び出され、テキストの値が変わったらイベントを投げる処理。
- URLLoaderをメソッドの外にするとテキストを取得できるが、同じ内容になってしまい、URLLoaderをメソッドの中に入れるとdataがUndifineで帰ってくる。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
「URLLoaderをメソッドの中に入れる入れない」は根本的に関係がありませんよ。 関係あるのはそこではなく 『「ロードしなさい!」=「ロードしたよ~♪」 ではない。』 ということです。 > txtloader02.load(urlReq02); ↑これは 「ロードしなさい!」 です。 「ロードしなさい!」 と言っただけでまだ目的のデータをSWF上にロードしていません。 それどころか 目的のファイルを開いてもいません。 またそれどころか ロードの開始さえもされていません。 「ロードしなさい!」 の後に 「ロード開始!!」 となって その信号がローカルやサーバに伝わり ローカルやサーバのHDDに記録されているデータをヘッダが読んだり そのデータが光ケーブルやローカルの電線を伝わってくるなどして ブラウザ や Flash Player 経由でSWF上にたどりついてから 「ロードしたよ~♪」 になるのです。 この 「ロードしたよ~♪」 状態になってはじめて, ロードしたデータがSWF上で処理できるのです。 当たり前ですがデータの到着前にデータの処理などできません。 http:// と C:/ とでは 「ロードをしなさい!」 →「ロードしたよ~♪」間の所要時間は変わりますが 時間がかかるということ自体は変わりありません。 ですからまず 「ロードしたよ~♪」を検知する必要があって その「ロードしたよ~♪」検知の後にロードしたデータを処理する必要があります。 したがって 例えば次のような感じにスクリプトを変更する必要があります。 (mc_1 など第三者が見てわけがわからないものはカット。) //----------------------------------- //URLRequestとURLLoaderインスタンスを作成 var urlReq02:URLRequest = new URLRequest("C:/swf_xsplit/twitter.txt"); var txtloader02:URLLoader = new URLLoader(); //ロードが完了したとき関数onLoadCompを実行する設定 txtloader02.addEventListener(Event.COMPLETE, onLoadComp); //関数onLoadCompの定義(★「ロードしたよ~♪」部分) function onLoadComp(e:Event):void { if (e.target.data != null) { var twitterStr02:String = e.target.data; var lines:String = twitterStr02; lines = lines.replace("\r\n"," ").replace("\n"," ").replace("\r"," ").replace("<br>"," ").replace("< /br>"," "); trace("timer = " + lines); trace("その他色々な動作 をする"); } } //関数init02の定義(★「ロードしなさい!」部分) function init02(event:Event):void { txtloader02.load(urlReq02); } //2秒間隔で関数init02を実行 var my_timer:Timer = new Timer(2000,0); my_timer.addEventListener(TimerEvent.TIMER, init02); my_timer.start(); //----------------------------------- 最初にも書きましたが 「URLLoaderをメソッドの中に入れる入れない」は関係ありません。 最初のこの3行↓ ------------------ //URLRequestとURLLoaderインスタンスを作成 var urlReq02:URLRequest = new URLRequest("C:/swf_xsplit/twitter.txt"); var txtloader02:URLLoader = new URLLoader(); //URLLoaderのロードが完了したとき関数onLoadCompを実行 txtloader02.addEventListener(Event.COMPLETE, onLoadComp); ------------------- これを 関数init02 の中に入れても無事に動作します。 動作しますが, 2秒間隔で何度も同じものを作り続けるのはおかしいので外に書いています。 ~~~プログラム動作の時間的流れ~~~ ・「2秒経ったよ!」イベントをTimerが受けとり . そのリスナー関数init02が実行される。 . ↓ ・関数init02内で「ロードしなさい!」命令が発生する。 . ↓ ~データ情報の読み取りや伝達動作が行われ~ ~やがてデータがSWF内に届く(ロードされる)~ . ↓ ・「ロードしたよ~♪」イベントをURLLoaderが受けとり . そのリスナー関数onLoadCompが実行される。 . ↓ ・関数onLoadComp内でロードしたデータの処理が行われる。 Flash は 「ロードは待ちたいヤツだけが待てば良い」 という仕様なのでわざわざ「待ちたいヤツを待たせる処理」が必要になります。 ロードでアニメーションなどの動作や他の処理を犠牲にしないためです。 例えば VBAなどはこのようなロードを待たせる処理を用意する必要はありません。 しかしその代わり「ロードは勝手に全体が待つ」という仕様になっています。 仮に Flash が VBA のような仕様ではギクシャクしてとても見れたものではなくなるでしょう。
お礼
回答有難うございます、大変丁寧に解説して頂き目からうろこ状態です、 1行1行読み進むと意外と解るものですね。 大変有難うございました。