使用Apache Flex的Worker

首先

下面简单总结了在Apache Flex中使用Worker的方法。
当执行需要时间的操作时,屏幕上可能会出现等待时间,
但是通过使用Worker,可以同时执行操作,从而避免屏幕上出现等待时间。

一个简单的例子

假设我们在Sub.as文件中编写了一个耗时的处理过程,并且希望在Main.mxml中调用并执行这个处理过程。

在Main.mxml中,加载Sub.swf后,以以下方式进行。

[Embed(source="../Sub.swf", mimeType="application/octet-stream")]
private var subClass:Class;

以下的操作可以执行。

var worker:Worker = WorkerDomain.current.createWorker(new subClass());
worker.start();

Main.mxml和Sub.as的内容将在后面进行描述。
(为了替代耗时的处理,编写了一个只进行5秒间隔睡眠的处理)

当点击「在Main中运行」按钮时,会在屏幕上产生等待时间,
而当点击「在Sub中运行」按钮时,由于使用了Worker,屏幕上不会产生等待。

在本次情况下,需要先编译Sub.as并创建Sub.swf。

> amxmlc src/Sub.as -output Sub.swf -debug=true
> amxmlc src/Main.mxml -output Main.swf

为了确认Sub.as脚本中trace(“Sub finished”)的输出内容,Sub.as脚本被编译时使用了-debug=true选项。

Main.mxml主要文件

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Style>
        * { 
            fontFamily: "Meiryo";
        }
    </fx:Style>

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;

            [Embed(source="../Sub.swf", mimeType="application/octet-stream")]
            private var subClass:Class;

            private function sleepMain():void {
                // 5秒スリープ
                var time:Number = new Date().getTime();
                while (new Date().getTime() - time < 5000) {
                }

                Alert.show("完了");
            }

            private function sleepSub():void {
                var worker:Worker = WorkerDomain.current.createWorker(new subClass());
                worker.start();

                Alert.show("完了");
            }
        ]]>
    </fx:Script>

    <s:Button label="Mainで実行" left="10" top="10" click="sleepMain();" />
    <s:Button label="Subで実行" left="10" top="40" click="sleepSub();" />
</s:WindowedApplication>

订阅。

package {
    import flash.display.Sprite;

    public class Sub extends Sprite {
        public function Sub() {
            // 5秒スリープ
            var time:Number = new Date().getTime();
            while (new Date().getTime() - time < 5000) {
            }

            trace("Sub finished");
        }
    }
}
广告
将在 10 秒后关闭
bannerAds