Flutter多线程处理插件dart_thread的使用
Flutter多线程处理插件 dart_thread
的使用
dart_thread
是一个经典的线程实现库,类似于 Delphi 中的 TThread。它易于使用,并且在所有平台上使用相同的代码(在桌面端映射到 Isolates,在 Web 端映射到 Workers)。
特性
DartThread
类包含onExecute
方法,在线程启动时执行。onGetMessage
方法在主线程发送消息时触发。DartThread
也可以向主线程发送消息。- 在 Web 平台上,从主线程发送变量给 Worker 时有严格的限制:JS 只允许发送基本类型,而不支持自定义类和其他结构。因此,
DartThread
提供了messageToObject
方法来实现自定义变量的打包和解包。
使用示例
示例代码
以下是一个完整的示例,展示了如何使用 dart_thread
插件:
import 'dart:math';
import 'package:dart_thread/dart_thread.dart';
class TestThread extends DartThread {
// 需要将类映射到 super.init,
// 因为 Dart 不允许覆盖静态方法
static TestThread newInstance() => TestThread();
@override
Future<void> onExecute(Function(dynamic message) sendMessage) async {
while (true) {
sendMessage(Random().nextInt(100));
await Future.delayed(Duration(seconds: 1));
}
}
@override
Future<void> onGetMessage(message, Function(dynamic message) sendMessage) async {
sendMessage(message);
}
}
void main() async {
TestThread testThread = TestThread();
await testThread.init(TestThread.newInstance, (message) {
// 接收来自 Isolate 或 Worker 的消息
print('Received from thread: $message');
});
// 发送消息到 Isolate 或 Worker
testThread.sendMessage('echo');
await Future.delayed(Duration(seconds: 10));
testThread.deInit();
}
自定义类的传递
在 Web 平台上,需要将自定义类转换为 JSON 格式进行传输。以下是如何实现这一功能的示例:
class CustomClass {
final int i;
final String s;
final double d;
CustomClass(this.i, this.s, this.d);
Map<String, dynamic> toJson() => {
'runtimeType': 'CustomClass',
'i': i,
's': s,
'd': d,
};
CustomClass.fromJson(Map<String, dynamic> json)
: i = json['i'],
s = json['s'],
d = json['d'];
@override
String toString() {
return '$i, $s, $d';
}
}
class TestThread extends DartThread {
@override
Future<void> onExecute(Function(dynamic message) sendMessage) async {
int counter = 0;
while (true) {
sendMessage(++counter);
await Future.delayed(Duration(seconds: 1));
}
}
@override
Future<void> onGetMessage(
message, Function(dynamic message) sendMessage) async {
print('Receive message from main thread: $message');
sendMessage(message);
}
@override
dynamic messageToObject(message) {
if (message is Map<String, dynamic>) {
if (message['runtimeType'] == 'CustomClass')
return CustomClass.fromJson(message);
}
return super.messageToObject(message);
}
}
void main() async {
TestThread testThread1 = TestThread();
TestThread testThread2 = TestThread();
await testThread1.init(TestThread.newInstance, (message) {
print('Receive message from testThread1: $message');
});
await testThread2.init(TestThread.newInstance, (message) {
print('Receive message from testThread2: $message');
});
testThread1.sendMessage('echo');
testThread2.sendMessage('echo');
CustomClass customClass = CustomClass(1, '1', 1.0);
testThread1.sendMessage(customClass);
testThread2.sendMessage(customClass);
await Future.delayed(Duration(seconds: 10));
testThread1.deInit();
testThread2.deInit();
}
准备 Web Worker
为了在 Web 平台上使用 dart_thread
,你需要创建一个 Web Worker 的 Dart 文件,并将其编译为 JavaScript 文件。以下是步骤:
-
创建名为
TestThread.dart
的 Web Worker Dart 文件:@JS() import 'dart:html'; import 'dart:js_interop'; import 'main.dart'; @JS('self') external JSObject get _self; DedicatedWorkerGlobalScope get self => _self as DedicatedWorkerGlobalScope; void main() async { await TestThread().main(self); }
-
使用命令行在项目中的
web
文件夹下编译 Dart 文件为 JavaScript 文件:set "dart_path=D:\sdk\flutter\bin\cache\dart-sdk\bin" set "flutter_web_sdk=D:\sdk\flutter\bin\cache\flutter_web_sdk" call "%dart_path%\dart" compile js -O2 --libraries-spec="%flutter_web_sdk"\libraries.json -o web/TestThread.dart.js lib/TestThread.dart || pause
更多关于Flutter多线程处理插件dart_thread的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复