アクセシビリティ
デベロッパーリソース

目次

ActionScript Thread Library 1.0 (そうめん) で非同期処理をスマートに

データ読み込みの例

最近の Flash や Flex では、外部データのやり取りをしない方が少ないと思います。特に、XML や、外部 SWF の読み込みは、必ずと言っていいほど行われます。

たとえば、複数の XML を順番に読み込んで、全ての読み込みが終わったら何か処理をする、という例を、ActionScript Thread Library を使って書くと、次のようになります。

import org.libspark.thread.Thread;
import org.libspark.thread.threads.net.URLLoaderThread;
import org.libspark.thread.utils.SerialExecutor;
 
public class LoadXMLsThread extends Thread
{
              private var _loaders:SerialExecutor;
              
              override protected function run():void
              {
                            // みっつの XML を読み込む
                            _loaders = new SerialExecutor();
                            _loaders.addThread(new URLLoaderThread(new URLRequest('a.xml'));
                            _loaders.addThread(new URLLoaderThread(new URLRequest('b.xml'));
                            _loaders.addThread(new URLLoaderThread(new URLRequest('c.xml'));
                            _loaders.start();
                            _loaders.join();
                            next(loadComplete);
              }
              
              private function loadComplete():void
              {
                            // 何か処理をする... ここでは XML の内容を出力
                            for (var i:uint = 0; i < _loaders.numThreads; ++i) {
                                          trace(URLLoaderThread(_loaders.getThreadAt(i)).loader.data);
                            }
              }
}


			

ここで、三つの新しいクラスが登場しています。

  • Thread
    全てのスレッドの元となる基底クラスです。この例のように、独自のスレッド (LoadXMLsThread) を作る場合も、このクラスを継承して、run メソッドをオーバーライドすることで処理を書きます。
  • URLLoaderThread
    URLLoader を用いてデータを読み込むスレッドです。コンストラクタで指定された URLRequest を用いてデータを読み込み、完了するとスレッドが終了します。
  • SerialExecutor
    複数のスレッドを、addThread メソッドで追加された順で、順番に実行するスレッドです。あるスレッドの実行が終了すると次のスレッドを実行し、全てのスレッドの実行が終了するとこのスレッドの実行が終了します。

Thread クラスの start メソッドを呼び出すと、スレッドの実行が開始されます。

_loaders.start();

ここでは、SerialExecutor の実行が開始され、addThread されている、「a.xml」と「b.xml」と「c.xml」を読みにいく URLoaderThread が、順番に実行されます。

Thread クラスの join メソッドを呼び出すと、呼び出した先のスレッドの終了を待機して、next メソッドで指定したメソッドを終了後に呼び出すようになります。

_loaders.join();
next(loadComplete);

そのため、SerialExecutor の実行が終了 (= 全ての URLLoaderThread の読み込みが終了) すると、loadComplete メソッドが呼び出され、取得した XML の内容が出力されます。