包 | flash.system |
类 | public final class WorkerDomain |
继承 | WorkerDomain Object |
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.4, AIR 3.4 |
注意:在桌面平台上,Flash Player 和 AIR 均支持使用 worker 实现并发。对于移动设备平台,AIR 在 Android 上支持并发,但 在 iOS 上不支持并发。在尝试使用并发之前,您可以使用 isSupported 静态属性来检查是否支持并发。
不要通过调用 WorkerDomain()
构造函数来直接创建 WorkerDomain 实例。一个应用程序只有一个 WorkerDomain 实例。在支持使用 worker 实现并发的上下文中,运行时在启动时会自动创建 WorkerDomain。您可以使用静态 current
属性访问该实例。
要创建 Worker 类的新实例,请使用 createWorker()
方法。要访问当前正在运行的 Worker 对象集,请使用 listWorkers()
方法。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
current : WorkerDomain [静态] [只读]
当前正在其中运行代码的 WorkerDomain 实例。 | WorkerDomain | ||
isSupported : Boolean [静态] [只读]
指示当前运行时上下文是否支持将 WorkerDomain 和 Worker 对象用于并行代码执行。 | WorkerDomain |
方法 | 由以下参数定义 | ||
---|---|---|---|
基于某个 swf 的字节创建一个新的 Worker 实例。 | WorkerDomain | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
提供对 WorkerDomain 中当前正在运行的 worker(Worker 实例的 state 属性为 WorkerState.RUNNING)集的访问。 | WorkerDomain | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object |
current | 属性 |
current:WorkerDomain
[只读] 语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.4, AIR 3.4 |
当前正在其中运行代码的 WorkerDomain 实例。这是应用程序中的唯一 WorkerDomain。
实现
public static function get current():WorkerDomain
isSupported | 属性 |
createWorker | () | 方法 |
public function createWorker(swf:ByteArray, giveAppPrivileges:Boolean = false):Worker
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 11.4, AIR 3.4 |
基于某个 swf 的字节创建一个新的 Worker
实例。
每个 worker 都是基于独立的 swf 应用程序创建的并且作为独立的 swf 应用程序执行。要创建 Worker 实例,您需要获取 SWF 文件的字节以作为 ByteArray 实例,并将该实例传递给此方法。针对此目的,有三种常用方式可用来访问 swf 的字节:
使用 [Embed] 元标记将 .swf 文件作为 ByteArray 嵌入在应用程序中:
// Embed the SWF file [Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")] private static var BgWorker_ByteClass:Class; private function createWorker():void { // create the background worker var workerBytes:ByteArray = new BgWorker_ByteClass(); var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); // listen for worker state changes to know when the worker is running bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler); // set up communication between workers using // setSharedProperty(), createMessageChannel(), etc. // ... (not shown) bgWorker.start(); }
使用 URLLoader 加载外部 SWF 文件:
// load the SWF file var workerLoader:URLLoader = new URLLoader(); workerLoader.dataFormat = URLLoaderDataFormat.BINARY; workerLoader.addEventListener(Event.COMPLETE, loadComplete); workerLoader.load(new URLRequest("BgWorker.swf")); private function loadComplete(event:Event):void { // create the background worker var workerBytes:ByteArray = event.target.data as ByteArray; var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); // listen for worker state changes to know when the worker is running bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler); // set up communication between workers using // setSharedProperty(), createMessageChannel(), etc. // ... (not shown) bgWorker.start(); }
将单个 swf 同时用作原始 worker 和后台 worker:
// The primordial worker's main class constructor public function PrimordialWorkerClass() { init(); } private function init():void { var swfBytes:ByteArray = this.loaderInfo.bytes; // Check to see if this is the primordial worker if (Worker.current.isPrimordial) { // create a background worker var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); // listen for worker state changes to know when the worker is running bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler); // set up communication between workers using // setSharedProperty(), createMessageChannel(), etc. // ... (not shown) bgWorker.start(); } else // entry point for the background worker { // set up communication between workers using getSharedProperty() // ... (not shown) // start the background work }
使用 createWorker()
创建一个 Worker 对象不会开始执行该 worker。要开始 worker 的代码执行,请调用 Worker 对象的 start()
方法。
Worker 非常有用,因为它们可以减少由于主渲染线程受其他代码阻止而使帧速率下降的可能。但是,worker 需要使用额外系统内存和 CPU,这可能使整体应用程序性能代价昂贵。由于每个 worker 均使用其自身的运行时虚拟机实例,因此即使不重要的 worker 开销也可能很大。当使用 worker 时,请在所有目标平台测试代码,以确保对系统的需求不是太大。Adobe 建议在典型情境下请勿使用超过一个或两个后台 worker。
参数
swf:ByteArray — 包含有效 swf 的字节的 ByteArray
| |
giveAppPrivileges:Boolean (default = false ) — 指示在 AIR 中是否应当向 worker 授予应用程序沙箱权限。在 Flash Player 中将忽略此参数
|
Worker — 创建成功时返回新创建的 Worker。返回值为 null 时表示无法创建 worker,因为当前上下文不支持并发或者创建新 worker 将超出实现限制。
|
引发
SecurityError — 如果其字节传递到 swf 参数的 swf 来自与调用此方法的 swf 不同的安全域
|
listWorkers | () | 方法 |
Tue Jun 12 2018, 11:04 AM Z