テキストファイルをロードする必要があるこのプログラムがありますが、AS3ではすべてがマルチスレッドであるため、ロードされていなくてもプログラムを続行します。同様に、テキストをロードする関数を作成し、ロードしたテキストを返すようにすると、常に「未定義」が返されます。処理が完了したときのためにイベント リスナーを追加する必要がありますが、テキストの返された処理を処理する方法が厄介です。プログラムを待機させる方法、またはロードされるまで何もしない方法はありますか?
2 に答える
いいえ、できません。
現在のようにCOMPLETEイベントをリッスンすることは、アプリケーションフローが完了したら待機して続行する正しい方法です。これがどのように厄介になるかわかりません-質問を更新して、イベントシステムについて不快に感じている原因に関する情報を含めて、そこから支援できるようにすることをお勧めします。
おそらく、イベントシステムでうまく機能するようにコードを構造化していないだけです。これは、いくつかのデータをロードし、完了したらアプリケーションを起動する非常にクリーンで簡単な方法を設定する方法です。
これがドキュメントクラスです。これは、実際のApplicationクラスの新しいインスタンスに転送されるテキストデータをロードするためのチャネルとして純粋に使用できます。
public class Main extends Sprite
{
private var _application:Application;
private var _loader:URLLoader;
public function Main()
{
var fileUrl:URLRequest = new URLRequest("file.txt");
_loader = new URLLoader(fileUrl);
_loader.addEventListener(Event.COMPLETE, _textLoaded);
}
private function _textLoaded(e:Event):void
{
_loader.removeEventListener(Event.COMPLETE, _textLoaded);
// Load the main Application with the required text data.
_application = new Application( _loader.data );
}
}
そして、あなたApplication
はあなたの中央クラスを考えることができます。
public class Application
{
public function Application(textData:String)
{
// Here we have access to the required text, and we can
// begin preparing the main Application.
trace(textData);
}
}
あなたが探しているのは、次のように、データを同期的にロードして、ロード呼び出しを行うだけですぐに返すことができるようにすることです。
# (this actually is not actionscript)
fileDataContents = open("file.txt", "r");
次に、fileDataContents をすぐに使用できるようにします。
設計上、これはフラッシュの仕組みではありません。
フラッシュへの外部データのロードはマルチスレッドではなく、非同期です。同期読み込みが行われない非常に良い理由の 1 つは、操作中にプログラムのブロック/ロックが発生し、ユーザー エクスペリエンスが低下する可能性があることです。
たとえば、これが Web 経由でファイルをロードしている場合: ユーザーのインターネット接続が切断/しゃっくりしたり、サーバー上で突然移動/削除/変更されたりした場合はどうなるでしょうか? または、ファイルのサイズは中程度であるが、ユーザーがダイヤルアップ接続を使用していた場合はどうなるでしょうか?
ほとんどの場合、これは制御できません。その結果、ユーザーのブラウザー ウィンドウで Flash が読み込まれようとして「永久に」フリーズし、ブラウザー全体がダウンして、最終的にはユーザーのパフォーマンスが低下する可能性があります。経験。そのループでプログラムをブロック/ロックすると、ユーザーに適切に回復または応答する方法がなくなります。