From 032300b1e5d2d959c8530603346d6a571b3df292 Mon Sep 17 00:00:00 2001 From: yihuiyang Date: Thu, 16 Nov 2023 16:33:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=9E=E7=8E=B0makeBackgroundTaskQueue?= =?UTF-8?q?=E7=9A=84taskqueue=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yihuiyang --- .../embedding/engine/dart/DartMessenger.ets | 72 ++++++++++++++++--- .../hvigor/hvigor-config.json5 | 22 ++---- .../ohos/flutter_embedding/local.properties | 3 +- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets index d0ac2be189..77e926377e 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets @@ -53,25 +53,39 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { pendingReplies: Map = new Map(); nextReplyId: number = 1; + taskQueueFactory: TaskQueueFactory; + createdTaskQueues: Map = new Map(); constructor(flutterNapi: FlutterNapi) { this.flutterNapi = flutterNapi; + this.taskQueueFactory = new DefaultTaskQueueFactory(); } - makeBackgroundTaskQueue(options?: TaskQueueOptions): TaskQueue { - Log.w(TAG, "ArkTS use aync function to perform time-consuming tasks"); - throw new Error('Method not implemented.'); + makeBackgroundTaskQueue(options: TaskQueueOptions): TaskQueue { + let taskQueue: DartMessengerTaskQueue = this.taskQueueFactory.makeBackgroundTaskQueue(options); + let token: TaskQueueToken = new TaskQueueToken(); + this.createdTaskQueues.set(token, taskQueue); + return token; } - setMessageHandler(channel: String, handler: BinaryMessageHandler): void { + setMessageHandler(channel: String, handler: BinaryMessageHandler, taskQueue?: TaskQueue): void { if (handler == null) { Log.d(TAG, "Removing handler for channel '" + channel + "'"); this.messageHandlers.delete(channel); return; } + let dartMessengerTaskQueue: DartMessengerTaskQueue | null; + if( taskQueue != null) { + dartMessengerTaskQueue = this.createdTaskQueues.get(taskQueue) ?? null; + if(dartMessengerTaskQueue == null) { + throw new Error( + "Unrecognized TaskQueue, use BinaryMessenger to create your TaskQueue (ex makeBackgroundTaskQueue)." + ); + } + } Log.d(TAG, "Setting handler for channel '" + channel + "'"); - this.messageHandlers.set(channel, new HandlerInfo(handler)); + this.messageHandlers.set(channel, new HandlerInfo(handler, dartMessengerTaskQueue)); this.bufferedMessages.delete(channel); } @@ -104,7 +118,23 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { } } - async invokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): Promise { + async asyncInvokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): Promise { + // Called from any thread. + if (handlerInfo != null) { + try { + Log.d(TAG, "Deferring to registered handler to process message."); + handlerInfo.handler.onMessage(message, new Reply(this.flutterNapi, replyId)); + } catch (ex) { + Log.e(TAG, "Uncaught exception in binary message listener", ex); + this.flutterNapi.invokePlatformMessageEmptyResponseCallback(replyId); + } + } else { + Log.d(TAG, "No registered handler for message. Responding to Dart with empty reply message."); + this.flutterNapi.invokePlatformMessageEmptyResponseCallback(replyId); + } + } + + invokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): void { // Called from any thread. if (handlerInfo != null) { try { @@ -136,7 +166,12 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { buffer.push(new BufferedMessageInfo(message, replyId, messageData)); } if (!messageDeferred) { - this.invokeHandler(handlerInfo, message, replyId); + //ArkTS 没有线程池,任务队列使用异步实现 + if(handlerInfo.taskQueue != null) { + this.asyncInvokeHandler(handlerInfo, message, replyId); + } else { + this.invokeHandler(handlerInfo, message, replyId); + } } } @@ -181,9 +216,10 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { */ class HandlerInfo { handler: BinaryMessageHandler; - - constructor(handler: BinaryMessageHandler) { + taskQueue: DartMessengerTaskQueue | null; + constructor(handler: BinaryMessageHandler, taskQueue?:DartMessengerTaskQueue) { this.handler = handler; + this.taskQueue = taskQueue ?? null; } } @@ -233,4 +269,20 @@ class Reply implements BinaryReply { interface DartMessengerTaskQueue { dispatch(): void; -} \ No newline at end of file +} + +interface TaskQueueFactory { + makeBackgroundTaskQueue(options: TaskQueueOptions): DartMessengerTaskQueue; +} + +class ConcurrentTaskQueue implements DartMessengerTaskQueue { + dispatch(): void {} +} + +class DefaultTaskQueueFactory implements TaskQueueFactory { + makeBackgroundTaskQueue(options: TaskQueueOptions): DartMessengerTaskQueue { + return new ConcurrentTaskQueue(); + } +} + +class TaskQueueToken implements TaskQueue {} \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 b/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 index 52c0a40dd2..5cca88dc49 100755 --- a/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 +++ b/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 @@ -1,21 +1,7 @@ -/* -* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - { - "hvigorVersion": "2.1.1", + "hvigorVersion": "file:../dependencies/hvigor-3.0.9-s.tgz", "dependencies": { - "@ohos/hvigor-ohos-plugin": "2.1.1" + "@ohos/hvigor-ohos-plugin": "file:../dependencies/hvigor-ohos-plugin-3.0.9-s.tgz", + "rollup": "file:../dependencies/rollup.tgz", } -} +} \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/local.properties b/shell/platform/ohos/flutter_embedding/local.properties index 42b3cf913e..aa1c1c6cec 100755 --- a/shell/platform/ohos/flutter_embedding/local.properties +++ b/shell/platform/ohos/flutter_embedding/local.properties @@ -18,6 +18,7 @@ # as it contains information specific to your local configuration. # # For customization when using a Version Control System, please read the header note. +hwsdk.dir= D:/Huawei/601 sdk.dir= -nodejs.dir= +nodejs.dir= D:/Node.js -- Gitee From 855e177417509e8b0b1a1a9ab6e7d6f1d511d560 Mon Sep 17 00:00:00 2001 From: yihuiyang Date: Thu, 16 Nov 2023 16:33:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=9E=E7=8E=B0makeBackgroundTaskQueue?= =?UTF-8?q?=E7=9A=84taskqueue=E5=BC=82=E6=AD=A5=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yihuiyang --- .../embedding/engine/dart/DartMessenger.ets | 72 ++++++++++++++++--- .../hvigor/hvigor-config.json5 | 22 ++---- .../ohos/flutter_embedding/local.properties | 1 + 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets index d0ac2be189..77e926377e 100644 --- a/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets +++ b/shell/platform/ohos/flutter_embedding/flutter/src/main/ets/embedding/engine/dart/DartMessenger.ets @@ -53,25 +53,39 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { pendingReplies: Map = new Map(); nextReplyId: number = 1; + taskQueueFactory: TaskQueueFactory; + createdTaskQueues: Map = new Map(); constructor(flutterNapi: FlutterNapi) { this.flutterNapi = flutterNapi; + this.taskQueueFactory = new DefaultTaskQueueFactory(); } - makeBackgroundTaskQueue(options?: TaskQueueOptions): TaskQueue { - Log.w(TAG, "ArkTS use aync function to perform time-consuming tasks"); - throw new Error('Method not implemented.'); + makeBackgroundTaskQueue(options: TaskQueueOptions): TaskQueue { + let taskQueue: DartMessengerTaskQueue = this.taskQueueFactory.makeBackgroundTaskQueue(options); + let token: TaskQueueToken = new TaskQueueToken(); + this.createdTaskQueues.set(token, taskQueue); + return token; } - setMessageHandler(channel: String, handler: BinaryMessageHandler): void { + setMessageHandler(channel: String, handler: BinaryMessageHandler, taskQueue?: TaskQueue): void { if (handler == null) { Log.d(TAG, "Removing handler for channel '" + channel + "'"); this.messageHandlers.delete(channel); return; } + let dartMessengerTaskQueue: DartMessengerTaskQueue | null; + if( taskQueue != null) { + dartMessengerTaskQueue = this.createdTaskQueues.get(taskQueue) ?? null; + if(dartMessengerTaskQueue == null) { + throw new Error( + "Unrecognized TaskQueue, use BinaryMessenger to create your TaskQueue (ex makeBackgroundTaskQueue)." + ); + } + } Log.d(TAG, "Setting handler for channel '" + channel + "'"); - this.messageHandlers.set(channel, new HandlerInfo(handler)); + this.messageHandlers.set(channel, new HandlerInfo(handler, dartMessengerTaskQueue)); this.bufferedMessages.delete(channel); } @@ -104,7 +118,23 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { } } - async invokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): Promise { + async asyncInvokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): Promise { + // Called from any thread. + if (handlerInfo != null) { + try { + Log.d(TAG, "Deferring to registered handler to process message."); + handlerInfo.handler.onMessage(message, new Reply(this.flutterNapi, replyId)); + } catch (ex) { + Log.e(TAG, "Uncaught exception in binary message listener", ex); + this.flutterNapi.invokePlatformMessageEmptyResponseCallback(replyId); + } + } else { + Log.d(TAG, "No registered handler for message. Responding to Dart with empty reply message."); + this.flutterNapi.invokePlatformMessageEmptyResponseCallback(replyId); + } + } + + invokeHandler(handlerInfo: HandlerInfo | null, message: ArrayBuffer, replyId: number): void { // Called from any thread. if (handlerInfo != null) { try { @@ -136,7 +166,12 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { buffer.push(new BufferedMessageInfo(message, replyId, messageData)); } if (!messageDeferred) { - this.invokeHandler(handlerInfo, message, replyId); + //ArkTS 没有线程池,任务队列使用异步实现 + if(handlerInfo.taskQueue != null) { + this.asyncInvokeHandler(handlerInfo, message, replyId); + } else { + this.invokeHandler(handlerInfo, message, replyId); + } } } @@ -181,9 +216,10 @@ export class DartMessenger implements BinaryMessenger, PlatformMessageHandler { */ class HandlerInfo { handler: BinaryMessageHandler; - - constructor(handler: BinaryMessageHandler) { + taskQueue: DartMessengerTaskQueue | null; + constructor(handler: BinaryMessageHandler, taskQueue?:DartMessengerTaskQueue) { this.handler = handler; + this.taskQueue = taskQueue ?? null; } } @@ -233,4 +269,20 @@ class Reply implements BinaryReply { interface DartMessengerTaskQueue { dispatch(): void; -} \ No newline at end of file +} + +interface TaskQueueFactory { + makeBackgroundTaskQueue(options: TaskQueueOptions): DartMessengerTaskQueue; +} + +class ConcurrentTaskQueue implements DartMessengerTaskQueue { + dispatch(): void {} +} + +class DefaultTaskQueueFactory implements TaskQueueFactory { + makeBackgroundTaskQueue(options: TaskQueueOptions): DartMessengerTaskQueue { + return new ConcurrentTaskQueue(); + } +} + +class TaskQueueToken implements TaskQueue {} \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 b/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 index 52c0a40dd2..5cca88dc49 100755 --- a/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 +++ b/shell/platform/ohos/flutter_embedding/hvigor/hvigor-config.json5 @@ -1,21 +1,7 @@ -/* -* Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - { - "hvigorVersion": "2.1.1", + "hvigorVersion": "file:../dependencies/hvigor-3.0.9-s.tgz", "dependencies": { - "@ohos/hvigor-ohos-plugin": "2.1.1" + "@ohos/hvigor-ohos-plugin": "file:../dependencies/hvigor-ohos-plugin-3.0.9-s.tgz", + "rollup": "file:../dependencies/rollup.tgz", } -} +} \ No newline at end of file diff --git a/shell/platform/ohos/flutter_embedding/local.properties b/shell/platform/ohos/flutter_embedding/local.properties index 42b3cf913e..2da9ead9a3 100755 --- a/shell/platform/ohos/flutter_embedding/local.properties +++ b/shell/platform/ohos/flutter_embedding/local.properties @@ -18,6 +18,7 @@ # as it contains information specific to your local configuration. # # For customization when using a Version Control System, please read the header note. +hwsdk.dir= sdk.dir= nodejs.dir= -- Gitee