啟動(dòng)一個(gè)Worker

2024-01-23 18:19 更新

Worker是與主線程并行的獨(dú)立線程。創(chuàng)建Worker的線程稱(chēng)之為宿主線程,Worker自身的線程稱(chēng)之為Worker線程。創(chuàng)建Worker傳入的url文件在Worker線程中執(zhí)行,可以處理耗時(shí)操作但不可以直接操作UI。

Worker主要作用是為應(yīng)用程序提供一個(gè)多線程的運(yùn)行環(huán)境,可滿足應(yīng)用程序在執(zhí)行過(guò)程中與主線程分離,在后臺(tái)線程中運(yùn)行一個(gè)腳本操作耗時(shí)操作,極大避免類(lèi)似于計(jì)算密集型或高延遲的任務(wù)阻塞主線程的運(yùn)行。由于Worker一旦被創(chuàng)建則不會(huì)主動(dòng)被銷(xiāo)毀,若不處于任務(wù)狀態(tài)一直運(yùn)行,在一定程度上會(huì)造成資源的浪費(fèi),應(yīng)及時(shí)關(guān)閉空閑的Worker。

Worker的上下文對(duì)象和主線程的上下文對(duì)象是不同的,Worker線程不支持UI操作。

說(shuō)明

本模塊首批接口從API version 7 開(kāi)始支持。后續(xù)版本的新增接口,采用上角標(biāo)單獨(dú)標(biāo)記接口的起始版本。

導(dǎo)入模塊

  1. import worker from '@ohos.worker';

屬性

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

workerPort9+

ThreadWorkerGlobalScope

worker線程用于與宿主線程通信的對(duì)象。

parentPort(deprecated)

DedicatedWorkerGlobalScope

worker線程用于與宿主線程通信的對(duì)象。

此屬性從API version 7開(kāi)始支持,從API version 9 開(kāi)始被廢棄。

建議使用workerPort9+替代。

WorkerOptions

Worker構(gòu)造函數(shù)的選項(xiàng)信息,用于為Worker添加其他信息。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

只讀

必填

說(shuō)明

type

"classic" | "module"

Worker執(zhí)行腳本的模式類(lèi)型,暫不支持module類(lèi)型,默認(rèn)值為"classic"。

name

string

Worker的名稱(chēng),默認(rèn)值為undefined。

shared

boolean

表示W(wǎng)orker共享功能,此接口暫不支持。

ThreadWorker9+

使用以下方法前,均需先構(gòu)造ThreadWorker實(shí)例,ThreadWorker類(lèi)繼承WorkerEventTarget。

constructor9+

constructor(scriptURL: string, options?: WorkerOptions)

ThreadWorker構(gòu)造函數(shù)。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

scriptURL

string

Worker執(zhí)行腳本的路徑。

在FA和Stage模型下,DevEco Studio新建Worker工程路徑分別存在以下兩種情況:

(a) worker腳本所在目錄與pages目錄同級(jí)。

(b) worker腳本所在目錄與pages目錄不同級(jí)。

options

WorkerOptions

Worker構(gòu)造的選項(xiàng)。

返回值:

類(lèi)型

說(shuō)明

ThreadWorker

執(zhí)行ThreadWorker構(gòu)造函數(shù)生成的ThreadWorker對(duì)象,失敗則返回undefined。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200003

Worker initialization failure.

10200007

The worker file patch is invalid path.

示例:

  1. import worker from '@ohos.worker';
  2. // worker線程創(chuàng)建
  3. // FA模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí))
  4. const workerFAModel01 = new worker.ThreadWorker("workers/worker.js", {name:"first worker in FA model"});
  5. // FA模型-目錄不同級(jí)(entry模塊下,workers目錄與pages目錄的父目錄同級(jí))
  6. const workerFAModel02 = new worker.ThreadWorker("../workers/worker.js");
  7. // Stage模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí))
  8. const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
  9. // Stage模型-目錄不同級(jí)(entry模塊下,workers目錄是pages目錄的子目錄)
  10. const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');
  11. // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
  12. // entry: 為module.json5文件中module的name屬性對(duì)應(yīng)的值,ets: 表明當(dāng)前使用的語(yǔ)言。
  13. // scriptURL與worker文件所在的workers目錄層級(jí)有關(guān),與new worker所在文件無(wú)關(guān)。
  14. // Stage模型工程esmodule編譯場(chǎng)景下,支持新增的scriptURL規(guī)格:@bundle:bundlename/entryname/ets/workerdir/workerfile
  15. // @bundle:為固定標(biāo)簽,bundlename為當(dāng)前應(yīng)用包名,entryname為當(dāng)前模塊名,ets為當(dāng)前使用語(yǔ)言
  16. // workerdir為worker文件所在目錄,workerfile為worker文件名
  17. // Stage模型-目錄同級(jí)(entry模塊下,workers目錄與pages目錄同級(jí)),假設(shè)bundlename是com.example.workerdemo
  18. const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
  19. // Stage模型-目錄不同級(jí)(entry模塊下,workers目錄是pages目錄的子目錄),假設(shè)bundlename是com.example.workerdemo
  20. const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');

同時(shí),需在工程的模塊級(jí)build-profile.json5文件的buildOption屬性中添加配置信息,主要分為下面兩種情況:

(1) 目錄同級(jí)

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

(2) 目錄不同級(jí)

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }

postMessage9+

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向Worker線程發(fā)送消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

transfer

ArrayBuffer[]

表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用,數(shù)組不可傳入null。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. var buffer = new ArrayBuffer(8);
  3. workerInstance.postMessage(buffer, [buffer]);

postMessage9+

postMessage(message: Object, options?: PostMessageOptions): void

宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向Worker線程發(fā)送消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

options

PostMessageOptions

當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎茫瑑H在Worker線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到Worker線程。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.postMessage("hello world");
  3. var buffer = new ArrayBuffer(8);
  4. workerInstance.postMessage(buffer, [buffer]);

on9+

on(type: string, listener: WorkerEventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與addEventListener9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

WorkerEventListener

回調(diào)的事件?;卣{(diào)事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.on("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

once9+

once(type: string, listener: WorkerEventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),事件監(jiān)聽(tīng)只執(zhí)行一次便自動(dòng)刪除。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

WorkerEventListener

回調(diào)的事件?;卣{(diào)事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.once("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

off9+

off(type: string, listener?: WorkerEventListener): void

刪除類(lèi)型為type的事件監(jiān)聽(tīng),該接口與removeEventListener9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

需要?jiǎng)h除的事件類(lèi)型。

listener

WorkerEventListener

回調(diào)的事件。刪除的回調(diào)事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //使用on接口、once接口或addEventListener接口創(chuàng)建“alert”事件,使用off接口刪除事件。
  3. workerInstance.off("alert");

terminate9+

terminate(): void

銷(xiāo)毀Worker線程,終止Worker接收消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.terminate();

onexit9+

onexit?: (code: number) => void

Worker對(duì)象的onexit屬性表示W(wǎng)orker銷(xiāo)毀時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

code

number

Worker退出的code。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onexit = function(e) {
  3. console.log("onexit");
  4. }
  5. // onexit被執(zhí)行兩種方式:
  6. // 主線程:
  7. workerInstance.terminate();
  8. // worker線程:
  9. // workerPort.close()

onerror9+

onerror?: (err: ErrorEvent) => void

Worker對(duì)象的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

err

ErrorEvent

異常數(shù)據(jù)。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onerror = function(e) {
  3. console.log("onerror");
  4. }

onmessage9+

onmessage?: (event: MessageEvents) => void

Worker對(duì)象的onmessage屬性表示宿主線程接收到來(lái)自其創(chuàng)建的Worker通過(guò)workerPort.postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

MessageEvents

收到的Worker消息數(shù)據(jù)。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onmessage = function(e) {
  3. // e : MessageEvents, 用法如下:
  4. // let data = e.data;
  5. console.log("onmessage");
  6. }

onmessageerror9+

onmessageerror?: (event: MessageEvents) => void

Worker對(duì)象的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

MessageEvents

異常數(shù)據(jù)。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.onmessageerror= function(e) {
  3. console.log("onmessageerror");
  4. }

addEventListener9+

addEventListener(type: string, listener: WorkerEventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

WorkerEventListener

回調(diào)的事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener9+

removeEventListener(type: string, callback?: WorkerEventListener): void

刪除Worker的事件監(jiān)聽(tīng),該接口與off9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。

callback

WorkerEventListener

回調(diào)的事件。刪除的回調(diào)事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

分發(fā)定義在Worker的事件。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

Event

需要分發(fā)的事件。

返回值:

類(lèi)型

說(shuō)明

boolean

分發(fā)的結(jié)果,false表示分發(fā)失敗。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。

分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
  14. //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
  22. //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
  23. //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  24. //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  25. //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

刪除Worker所有的事件監(jiān)聽(tīng)。

系統(tǒng)能力: SystemCapability.Utils.Lang

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

WorkerEventTarget9+

處理Worker監(jiān)聽(tīng)事件。

addEventListener9+

addEventListener(type: string, listener: WorkerEventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

WorkerEventListener

回調(diào)的事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener9+

removeEventListener(type: string, callback?: WorkerEventListener): void

刪除Worker的事件監(jiān)聽(tīng),該接口與off9+接口功能一致。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。

callback

WorkerEventListener

回調(diào)的事件。刪除的回調(diào)事件。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

分發(fā)定義在Worker的事件。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

Event

需要分發(fā)的事件。

返回值:

類(lèi)型

說(shuō)明

boolean

分發(fā)的結(jié)果,false表示分發(fā)失敗。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。

分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
  14. //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
  22. //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
  23. //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  24. //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  25. //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

刪除Worker所有的事件監(jiān)聽(tīng)。

系統(tǒng)能力: SystemCapability.Utils.Lang

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

ThreadWorkerGlobalScope9+

Worker線程用于與宿主線程通信的類(lèi),通過(guò)postMessage接口發(fā)送消息給宿主線程、close接口銷(xiāo)毀Worker線程。ThreadWorkerGlobalScope類(lèi)繼承GlobalScope9+。

postMessage9+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void

Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

transfer

ArrayBuffer[]

表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎?,僅在宿主線程中可用,數(shù)組不可傳入null。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. var buffer = new ArrayBuffer(8);
  7. workerPort.postMessage(buffer, [buffer]);
  8. }

postMessage9+

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向宿主線程發(fā)送消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

options

PostMessageOptions

當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎茫瑑H在宿主線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到宿主線程。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200006

Serializing an uncaught exception failed.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. workerPort.postMessage("receive data from main.js");
  7. }

close9+

close(): void

銷(xiāo)毀Worker線程,終止Worker接收消息。

系統(tǒng)能力: SystemCapability.Utils.Lang

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e) {
  5. workerPort.close()
  6. }

onmessage9+

onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

ThreadWorkerGlobalScope的onmessage屬性表示W(wǎng)orker線程收到來(lái)自其宿主線程通過(guò)postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

this

ThreadWorkerGlobalScope

指向調(diào)用者對(duì)象。

ev

MessageEvents

收到宿主線程發(fā)送的數(shù)據(jù)。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  4. workerInstance.postMessage("hello world");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e) {
  5. console.log("receive main.js message");
  6. }

onmessageerror9+

onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

ThreadWorkerGlobalScope的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被反序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

this

ThreadWorkerGlobalScope

指向調(diào)用者對(duì)象。

ev

MessageEvents

異常數(shù)據(jù)。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessageerror = function(e) {
  5. console.log("worker.js onmessageerror")
  6. }

WorkerEventListener9+

(event: Event): void | Promise<void>

事件監(jiān)聽(tīng)類(lèi)。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

Event

回調(diào)的事件類(lèi)。

返回值:

類(lèi)型

說(shuō)明

void | Promise<void>

無(wú)返回值或者以Promise形式返回。

錯(cuò)誤碼:

以下錯(cuò)誤碼的詳細(xì)介紹請(qǐng)參見(jiàn)語(yǔ)言基礎(chǔ)類(lèi)庫(kù)錯(cuò)誤碼。

錯(cuò)誤碼ID

錯(cuò)誤信息

10200004

Worker instance is not running.

10200005

The invoked API is not supported in workers.

示例:

  1. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

GlobalScope9+

Worker線程自身的運(yùn)行環(huán)境,GlobalScope類(lèi)繼承WorkerEventTarget

屬性

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

name

string

Worker的名字,new Worker時(shí)指定。

self

GlobalScope & typeof globalThis

GlobalScope本身。

onerror9+

onerror?: (ev: ErrorEvent) => void

GlobalScope的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

ev

ErrorEvent

異常數(shù)據(jù)。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort
  4. workerPort.onerror = function(e){
  5. console.log("worker.js onerror")
  6. }

MessageEvents9+

消息類(lèi),持有Worker線程間傳遞的數(shù)據(jù)。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

data

any

線程間傳遞的數(shù)據(jù)。

Worker(deprecated)

使用以下方法前,均需先構(gòu)造Worker實(shí)例,Worker類(lèi)繼承EventTarget

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker9+替代。

constructor(deprecated)

constructor(scriptURL: string, options?: WorkerOptions)

Worker構(gòu)造函數(shù)。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.constructor9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

scriptURL

string

Worker執(zhí)行腳本的路徑。

在FA和Stage模型下,DevEco Studio新建Worker工程路徑分別存在以下兩種情況:

(a) worker腳本所在目錄與pages目錄同級(jí)。

(b) worker腳本所在目錄與pages目錄不同級(jí)。

options

WorkerOptions

Worker構(gòu)造的選項(xiàng)。

返回值:

類(lèi)型

說(shuō)明

Worker

執(zhí)行Worker構(gòu)造函數(shù)生成的Worker對(duì)象,失敗則返回undefined。

示例:

  1. import worker from '@ohos.worker';
  2. // worker線程創(chuàng)建
  3. // FA模型-目錄同級(jí)
  4. const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker in FA model"});
  5. // FA模型-目錄不同級(jí)(以workers目錄放置pages目錄前一級(jí)為例)
  6. const workerFAModel02 = new worker.Worker("../workers/worker.js");
  7. // Stage模型-目錄同級(jí)
  8. const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
  9. // Stage模型-目錄不同級(jí)(以workers目錄放置pages目錄后一級(jí)為例)
  10. const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');
  11. // 理解Stage模型scriptURL的"entry/ets/workers/worker.ts":
  12. // entry: 為module.json5文件中module的name屬性對(duì)應(yīng)的值;
  13. // ets: 表明當(dāng)前使用的語(yǔ)言。

同時(shí),需在工程的模塊級(jí)build-profile.json5文件的buildOption屬性中添加配置信息,主要分為下面兩種情況:

(1) 目錄同級(jí)

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

(2) 目錄不同級(jí)

FA模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }

postMessage(deprecated)

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向Worker線程發(fā)送消息。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.postMessage9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

transfer

ArrayBuffer[]

表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用,數(shù)組不可傳入null。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. var buffer = new ArrayBuffer(8);
  3. workerInstance.postMessage(buffer, [buffer]);

postMessage(deprecated)

postMessage(message: Object, options?: PostMessageOptions): void

宿主線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向Worker線程發(fā)送消息。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.postMessage9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至Worker的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

options

PostMessageOptions

當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到Worker線程,在宿主線程中將會(huì)變?yōu)椴豢捎?,僅在Worker線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到Worker線程。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.postMessage("hello world");
  3. var buffer = new ArrayBuffer(8);
  4. workerInstance.postMessage(buffer, [buffer]);

on(deprecated)

on(type: string, listener: EventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與addEventListener(deprecated)接口功能一致。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.on9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

EventListener

回調(diào)事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.on("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

once(deprecated)

once(type: string, listener: EventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),事件監(jiān)聽(tīng)只執(zhí)行一次便自動(dòng)刪除。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.once9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

EventListener

回調(diào)事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.once("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

off(deprecated)

off(type: string, listener?: EventListener): void

刪除類(lèi)型為type的事件監(jiān)聽(tīng),該接口與removeEventListener(deprecated)接口功能一致。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.off9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

需要?jiǎng)h除的事件類(lèi)型。

listener

EventListener

刪除的回調(diào)事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. //使用on接口、once接口或addEventListener接口創(chuàng)建“alert”事件,使用off接口刪除事件。
  3. workerInstance.off("alert");

terminate(deprecated)

terminate(): void

銷(xiāo)毀Worker線程,終止Worker接收消息。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.terminate9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.terminate();

onexit(deprecated)

onexit?: (code: number) => void

Worker對(duì)象的onexit屬性表示W(wǎng)orker銷(xiāo)毀時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onexit9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

code

number

Worker退出的code。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onexit = function(e) {
  3. console.log("onexit");
  4. }
  5. //onexit被執(zhí)行兩種方式:
  6. //主線程:
  7. workerInstance.terminate();
  8. //worker線程:
  9. //parentPort.close()

onerror(deprecated)

onerror?: (err: ErrorEvent) => void

Worker對(duì)象的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onerror9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

err

ErrorEvent

異常數(shù)據(jù)。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onerror = function(e) {
  3. console.log("onerror");
  4. }

onmessage(deprecated)

onmessage?: (event: MessageEvent) => void

Worker對(duì)象的onmessage屬性表示宿主線程接收到來(lái)自其創(chuàng)建的Worker通過(guò)parentPort.postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onmessage9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

MessageEvent

收到的Worker消息數(shù)據(jù)。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onmessage = function(e) {
  3. // e : MessageEvent, 用法如下:
  4. // let data = e.data;
  5. console.log("onmessage");
  6. }

onmessageerror(deprecated)

onmessageerror?: (event: MessageEvent) => void

Worker對(duì)象的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在宿主線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorker.onmessageerror9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

MessageEvent

異常數(shù)據(jù)。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.onmessageerror= function(e) {
  3. console.log("onmessageerror");
  4. }

EventTarget(deprecated)

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用WorkerEventTarget9+替代。

addEventListener(deprecated)

addEventListener(type: string, listener: EventListener): void

向Worker添加一個(gè)事件監(jiān)聽(tīng),該接口與on(deprecated)接口功能一致。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用addEventListener9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

監(jiān)聽(tīng)的事件類(lèi)型。

listener

EventListener

回調(diào)的事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

removeEventListener(deprecated)

removeEventListener(type: string, callback?: EventListener): void

刪除Worker的事件監(jiān)聽(tīng),該接口與off(deprecated)接口功能一致。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用removeEventListener9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

type

string

需要?jiǎng)h除的監(jiān)聽(tīng)事件類(lèi)型。

callback

EventListener

刪除的回調(diào)事件。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeEventListener("alert");

dispatchEvent(deprecated)

dispatchEvent(event: Event): boolean

分發(fā)定義在Worker的事件。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用dispatchEvent9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

event

Event

需要分發(fā)的事件。

返回值:

類(lèi)型

說(shuō)明

boolean

分發(fā)的結(jié)果,false表示分發(fā)失敗。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暫未支持。

分發(fā)事件(dispatchEvent)可與監(jiān)聽(tīng)接口(on、once、addEventListener)搭配使用,示例如下:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. //用法一:
  3. workerInstance.on("alert_on", (e)=>{
  4. console.log("alert listener callback");
  5. })
  6. workerInstance.once("alert_once", (e)=>{
  7. console.log("alert listener callback");
  8. })
  9. workerInstance.addEventListener("alert_add", (e)=>{
  10. console.log("alert listener callback");
  11. })
  12. //once接口創(chuàng)建的事件執(zhí)行一次便會(huì)刪除。
  13. workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暫未支持。
  14. //on接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  15. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  16. workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
  17. //addEventListener接口創(chuàng)建的事件可以一直被分發(fā),不能主動(dòng)刪除。
  18. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  19. workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
  20. //用法二:
  21. //event類(lèi)型的type支持自定義,同時(shí)存在"message"/"messageerror"/"error"特殊類(lèi)型,如下所示
  22. //當(dāng)type = "message",onmessage接口定義的方法同時(shí)會(huì)執(zhí)行。
  23. //當(dāng)type = "messageerror",onmessageerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  24. //當(dāng)type = "error",onerror接口定義的方法同時(shí)會(huì)執(zhí)行。
  25. //若調(diào)用removeEventListener接口或者off接口取消事件時(shí),能且只能取消使用addEventListener/on/once創(chuàng)建的事件。
  26. workerInstance.addEventListener("message", (e)=>{
  27. console.log("message listener callback");
  28. })
  29. workerInstance.onmessage = function(e) {
  30. console.log("onmessage : message listener callback");
  31. }
  32. //調(diào)用dispatchEvent分發(fā)“message”事件,addEventListener和onmessage中定義的方法都會(huì)被執(zhí)行。
  33. workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener(deprecated)

removeAllListener(): void

刪除Worker所有的事件監(jiān)聽(tīng)。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用removeAllListener9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })
  5. workerInstance.removeAllListener();

DedicatedWorkerGlobalScope(deprecated)

Worker線程用于與宿主線程通信的類(lèi),通過(guò)postMessage接口發(fā)送消息給宿主線程、close接口銷(xiāo)毀Worker線程。DedicatedWorkerGlobalScope類(lèi)繼承WorkerGlobalScope。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope9+替代。

postMessage9+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void

Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。

說(shuō)明

DedicatedWorkerGlobalScope類(lèi)自API version 9 開(kāi)始廢棄,本接口建議使用ThreadWorkerGlobalScope.postMessage替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

transfer

ArrayBuffer[]

表示可轉(zhuǎn)移的ArrayBuffer實(shí)例對(duì)象數(shù)組,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎茫瑑H在宿主線程中可用,數(shù)組不可傳入null。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = function(e){
  5. // let data = e.data;
  6. let buffer = new ArrayBuffer(5)
  7. workerPort.postMessage(buffer, [buffer]);
  8. }

postMessage(deprecated)

postMessage(messageObject: Object, transfer: Transferable[]): void

Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)的方式向宿主線程發(fā)送消息。

說(shuō)明

此接口暫不支持使用,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.postMessage替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

messageObject

Object

發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

options

Transferable[]

暫不支持該參數(shù)類(lèi)型。

postMessage(deprecated)

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker線程通過(guò)轉(zhuǎn)移對(duì)象所有權(quán)或者拷貝數(shù)據(jù)的方式向宿主線程發(fā)送消息。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.postMessage替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

message

Object

發(fā)送至宿主線程的數(shù)據(jù),該數(shù)據(jù)對(duì)象必須是可序列化,序列化支持類(lèi)型見(jiàn)其他說(shuō)明。

options

PostMessageOptions

當(dāng)填入該參數(shù)時(shí),與傳入ArrayBuffer[]的作用一致,該數(shù)組中對(duì)象的所有權(quán)會(huì)被轉(zhuǎn)移到宿主線程,在Worker線程中將會(huì)變?yōu)椴豢捎?,僅在宿主線程中可用。若不填入該參數(shù),默認(rèn)設(shè)置為 undefined,通過(guò)拷貝數(shù)據(jù)的方式傳輸信息到宿主線程。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = function(e) {
  6. // let data = e.data;
  7. console.log("receive data from worker.js");
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e){
  5. // let data = e.data;
  6. parentPort.postMessage("receive data from main.js");
  7. }

close(deprecated)

close(): void

銷(xiāo)毀Worker線程,終止Worker接收消息。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.close替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e) {
  5. parentPort.close()
  6. }

onmessage(deprecated)

onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessage屬性表示W(wǎng)orker線程收到來(lái)自其宿主線程通過(guò)postMessage接口發(fā)送的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.onmessage替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

this

DedicatedWorkerGlobalScope

指向調(diào)用者對(duì)象。

ev

MessageEvent

收到宿主線程發(fā)送的數(shù)據(jù)。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  4. workerInstance.postMessage("hello world");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = function(e) {
  5. console.log("receive main.js message");
  6. }

onmessageerror(deprecated)

onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

DedicatedWorkerGlobalScope的onmessageerror屬性表示當(dāng)Worker對(duì)象接收到一條無(wú)法被反序列化的消息時(shí)被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用ThreadWorkerGlobalScope.onmessageerror替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

this

DedicatedWorkerGlobalScope

指向調(diào)用者對(duì)象。

ev

MessageEvent

異常數(shù)據(jù)。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js");
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessageerror = function(e) {
  5. console.log("worker.js onmessageerror")
  6. }

PostMessageOptions

明確數(shù)據(jù)傳遞過(guò)程中需要轉(zhuǎn)移所有權(quán)對(duì)象的類(lèi),傳遞所有權(quán)的對(duì)象必須是ArrayBuffer,發(fā)送它的上下文中將會(huì)變?yōu)椴豢捎?,僅在接收方可用。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

transfer

Object[]

ArrayBuffer數(shù)組,用于傳遞所有權(quán)。該數(shù)組中不可傳入null。

Event

事件類(lèi)。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

type

string

指定事件的類(lèi)型。

timeStamp

number

事件創(chuàng)建時(shí)的時(shí)間戳(精度為毫秒),暫未支持。

EventListener(deprecated)

(evt: Event): void | Promise<void>

事件監(jiān)聽(tīng)類(lèi)。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用WorkerEventListener9+替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

evt

Event

回調(diào)的事件類(lèi)。

返回值:

類(lèi)型

說(shuō)明

void | Promise<void>

無(wú)返回值或者以Promise形式返回。

示例:

  1. const workerInstance = new worker.Worker("workers/worker.js");
  2. workerInstance.addEventListener("alert", (e)=>{
  3. console.log("alert listener callback");
  4. })

ErrorEvent

錯(cuò)誤事件類(lèi),用于表示W(wǎng)orker執(zhí)行過(guò)程中出現(xiàn)異常的詳細(xì)信息,ErrorEvent類(lèi)繼承Event。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

message

string

異常發(fā)生的錯(cuò)誤信息。

filename

string

出現(xiàn)異常所在的文件。

lineno

number

異常所在的行數(shù)。

colno

number

異常所在的列數(shù)。

error

Object

異常類(lèi)型。

MessageEvent<T>

消息類(lèi),持有Worker線程間傳遞的數(shù)據(jù)。

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

data

T

線程間傳遞的數(shù)據(jù)。

WorkerGlobalScope(deprecated)

Worker線程自身的運(yùn)行環(huán)境,WorkerGlobalScope類(lèi)繼承EventTarget。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用GlobalScope9+替代。

屬性

系統(tǒng)能力: SystemCapability.Utils.Lang

名稱(chēng)

類(lèi)型

可讀

可寫(xiě)

說(shuō)明

name

string

Worker的名字,new Worker時(shí)指定。

self

WorkerGlobalScope & typeof globalThis

WorkerGlobalScope本身。

onerror(deprecated)

onerror?: (ev: ErrorEvent) => void

WorkerGlobalScope的onerror屬性表示W(wǎng)orker在執(zhí)行過(guò)程中發(fā)生異常被調(diào)用的事件處理程序,處理程序在Worker線程中執(zhí)行。

說(shuō)明

從API version 7 開(kāi)始支持,從API version 9 開(kāi)始廢棄,建議使用GlobalScope.onerror替代。

系統(tǒng)能力: SystemCapability.Utils.Lang

參數(shù):

參數(shù)名

類(lèi)型

必填

說(shuō)明

ev

ErrorEvent

異常數(shù)據(jù)。

示例:

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.Worker("workers/worker.js")
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const parentPort = worker.parentPort
  4. parentPort.onerror = function(e){
  5. console.log("worker.js onerror")
  6. }

其他說(shuō)明

序列化支持類(lèi)型

Type

備注

是否支持

All Primitive Type

不包括symbol

Date

 

String

 

RegExp

 

Array

 

Map

 

Set

 

Object

只支持Plain Object,不支持帶function的

ArrayBuffer

提供transfer能力

TypedArray

 

特例:傳遞通過(guò)自定義class創(chuàng)建出來(lái)的object時(shí),不會(huì)發(fā)生序列化錯(cuò)誤,但是自定義class的屬性(如Function)無(wú)法通過(guò)序列化傳遞。

說(shuō)明

以API version 9的FA工程為例。

  1. // main.js
  2. import worker from '@ohos.worker';
  3. const workerInstance = new worker.ThreadWorker("workers/worker.js");
  4. workerInstance.postMessage("message from main to worker");
  5. workerInstance.onmessage = function(d) {
  6. // 當(dāng)worker線程傳遞obj2時(shí),data即為obj2。data沒(méi)有Init、SetName的方法
  7. let data = d.data;
  8. }
  1. // worker.js
  2. import worker from '@ohos.worker';
  3. const workerPort = worker.workerPort;
  4. class MyModel {
  5. name = "undefined"
  6. Init() {
  7. this.name = "MyModel"
  8. }
  9. }
  10. workerPort.onmessage = function(d) {
  11. console.log("worker.js onmessage");
  12. let data = d.data;
  13. let func1 = function() {
  14. console.log("post message is function");
  15. }
  16. let obj1 = {
  17. "index": 2,
  18. "name1": "zhangshan",
  19. setName() {
  20. this.index = 3;
  21. }
  22. }
  23. let obj2 = new MyModel();
  24. // workerPort.postMessage(func1); 傳遞func1發(fā)生序列化錯(cuò)誤
  25. // workerPort.postMessage(obj1); 傳遞obj1發(fā)生序列化錯(cuò)誤
  26. workerPort.postMessage(obj2); // 傳遞obj2不會(huì)發(fā)生序列化錯(cuò)誤
  27. }
  28. workerPort.onmessageerror = function(e) {
  29. console.log("worker.js onmessageerror");
  30. }
  31. workerPort.onerror = function(e) {
  32. console.log("worker.js onerror");
  33. }

內(nèi)存模型

Worker基于Actor并發(fā)模型實(shí)現(xiàn)。在Worker的交互流程中,JS主線程可以創(chuàng)建多個(gè)Worker子線程,各個(gè)Worker線程間相互隔離,并通過(guò)序列化傳遞對(duì)象,等到Worker線程完成計(jì)算任務(wù),再把結(jié)果返回給主線程。

Actor并發(fā)模型的交互原理:各個(gè)Actor并發(fā)地處理主線程任務(wù),每個(gè)Actor內(nèi)部都有一個(gè)消息隊(duì)列及單線程執(zhí)行模塊,消息隊(duì)列負(fù)責(zé)接收主線程及其他Actor的請(qǐng)求,單線程執(zhí)行模塊則負(fù)責(zé)串行地處理請(qǐng)求、向其他Actor發(fā)送請(qǐng)求以及創(chuàng)建新的Actor。由于Actor采用的是異步方式,各個(gè)Actor之間相互隔離沒(méi)有數(shù)據(jù)競(jìng)爭(zhēng),因此Actor可以高并發(fā)運(yùn)行。

注意事項(xiàng)

  • Worker存在數(shù)量限制,當(dāng)前支持最多同時(shí)存在8個(gè)Worker。
  • 在API version 8及之前的版本,當(dāng)Worker數(shù)量超出限制時(shí),會(huì)拋出錯(cuò)誤Error "Too many workers, the number of workers exceeds the maximum."。
  • 從API version 9開(kāi)始,當(dāng)Worker數(shù)量超出限制時(shí),會(huì)拋出錯(cuò)誤BusinessError "Worker initialization failure, the number of workers exceeds the maximum."。
  • 主動(dòng)銷(xiāo)毀Worker可以調(diào)用新創(chuàng)建Worker對(duì)象的terminate()或workerPort.close()方法。
  • 自API version 9版本開(kāi)始,若Worker處于已經(jīng)銷(xiāo)毀或正在銷(xiāo)毀等非運(yùn)行狀態(tài)時(shí),調(diào)用其功能接口,會(huì)拋出相應(yīng)的BusinessError。
  • Worker的創(chuàng)建和銷(xiāo)毀耗費(fèi)性能,建議管理已創(chuàng)建的Worker并重復(fù)使用。
  • 創(chuàng)建Worker工程時(shí),new worker.Worker構(gòu)造函數(shù)和new worker.ThreadWorker構(gòu)造函數(shù)不能同時(shí)使用,否則將導(dǎo)致工程中Worker的功能異常。自API version 9版本開(kāi)始,建議使用new worker.ThreadWorker構(gòu)造函數(shù),在API version 8及之前的版本,建議使用new worker.Worker構(gòu)造函數(shù)。
  • 創(chuàng)建Worker工程時(shí),在Worker線程的文件中(比如本文中worker.ts)不能導(dǎo)入任何有關(guān)構(gòu)建UI的方法(比如ETS文件等),否則會(huì)導(dǎo)致Worker的功能失效。排查方式:解壓生成的Hap包,在創(chuàng)建Worker線程的文件目錄中找到"worker.js",全局搜索"View"關(guān)鍵字。如果存在該關(guān)鍵字,說(shuō)明在worker.js中打包進(jìn)去了構(gòu)建UI的方法,會(huì)導(dǎo)致Worker的功能失效,建議在創(chuàng)建Worker線程的文件中修改 "import “xxx” from src"中src的目錄層級(jí)。
  • 線程間通信時(shí)傳遞的數(shù)據(jù)量最大限制為16M。

完整示例

說(shuō)明

以API version 9的工程為例。

API version 8及之前的版本僅支持FA模型,如需使用,注意更換構(gòu)造Worker的接口和創(chuàng)建worker線程中與主線程通信的對(duì)象的兩個(gè)方法。

FA模型

  1. // main.js(同級(jí)目錄為例)
  2. import worker from '@ohos.worker';
  3. // 主線程中創(chuàng)建Worker對(duì)象
  4. const workerInstance = new worker.ThreadWorker("workers/worker.ts");
  5. // 創(chuàng)建js和ts文件都可以
  6. // const workerInstance = new worker.ThreadWorker("workers/worker.js");
  7. // API version 9之前版本,worker對(duì)象的構(gòu)造方法
  8. // const workerInstance = new worker.Worker("workers/worker.js");
  9. // 主線程向worker線程傳遞信息
  10. workerInstance.postMessage("123");
  11. // 主線程接收worker線程信息
  12. workerInstance.onmessage = function(e) {
  13. // data:worker線程發(fā)送的信息
  14. let data = e.data;
  15. console.log("main.js onmessage");
  16. // 銷(xiāo)毀Worker對(duì)象
  17. workerInstance.terminate();
  18. }
  19. // 在調(diào)用terminate后,執(zhí)行回調(diào)onexit
  20. workerInstance.onexit = function() {
  21. console.log("main.js terminate");
  22. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. // 創(chuàng)建worker線程中與主線程通信的對(duì)象
  4. const workerPort = worker.workerPort
  5. // API version 9之前版本,創(chuàng)建worker線程中與主線程通信的對(duì)象
  6. // const parentPort = worker.parentPort
  7. // worker線程接收主線程信息
  8. workerPort.onmessage = function(e) {
  9. // data:主線程發(fā)送的信息
  10. let data = e.data;
  11. console.log("worker.ts onmessage");
  12. // worker線程向主線程發(fā)送信息
  13. workerPort.postMessage("123")
  14. }
  15. // worker線程發(fā)生error的回調(diào)
  16. workerPort.onerror= function(e) {
  17. console.log("worker.ts onerror");
  18. }

build-profile.json5 配置 :

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/MainAbility/workers/worker.ts"
  5. ]
  6. }
  7. }

Stage模型

  1. // main.js(以不同目錄為例)
  2. import worker from '@ohos.worker';
  3. // 主線程中創(chuàng)建Worker對(duì)象
  4. const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ts");
  5. // 創(chuàng)建js和ts文件都可以
  6. // const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.js");
  7. // 主線程向worker線程傳遞信息
  8. workerInstance.postMessage("123");
  9. // 主線程接收worker線程信息
  10. workerInstance.onmessage = function(e) {
  11. // data:worker線程發(fā)送的信息
  12. let data = e.data;
  13. console.log("main.js onmessage");
  14. // 銷(xiāo)毀Worker對(duì)象
  15. workerInstance.terminate();
  16. }
  17. // 在調(diào)用terminate后,執(zhí)行onexit
  18. workerInstance.onexit = function() {
  19. console.log("main.js terminate");
  20. }
  1. // worker.ts
  2. import worker from '@ohos.worker';
  3. // 創(chuàng)建worker線程中與主線程通信的對(duì)象
  4. const workerPort = worker.workerPort
  5. // worker線程接收主線程信息
  6. workerPort.onmessage = function(e) {
  7. // data:主線程發(fā)送的信息
  8. let data = e.data;
  9. console.log("worker.ts onmessage");
  10. // worker線程向主線程發(fā)送信息
  11. workerPort.postMessage("123")
  12. }
  13. // worker線程發(fā)生error的回調(diào)
  14. workerPort.onerror= function(e) {
  15. console.log("worker.ts onerror");
  16. }

build-profile.json5 配置:

  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/pages/workers/worker.ts"
  5. ]
  6. }
  7. }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)