Isolate.spawn 创建形式
子线程返回数据到主线程
- 主线程不需要回传数据给子线程
void function_main() async {
print("当前线程:"+ Isolate.current.debugName);
// 声明ReceivePort对象用来监听回调的数据
var receivePort = new ReceivePort();
// 两个isolate之间通过SendPort来进行通信
Isolate childIsolate = await Isolate.spawn(entryPoint, "就是entryPoint方法中接受的参数");
/* 接收方式 1 */
// 意思是第一次接收到消息,msg 就是子线程发送过来的数据
String msg = await receivePort.first;
/* 接收方式 2 */
receivePort.listen((message) {
//msg 就是子线程发送过来的数据
String msg = message;
// 关闭监听
receivePort.close();
//杀死线程资源
childIsolate.kill();
});
}
void entryPoint(String str) async {
// 这里把回传的数据send回主线程
sendPort.send("将数据发送到主线程 + ${str}");
}
子线程和主线程之间通信
- 子线程返回数据到主线程后-主线程再次返回数据到子线程
void function_main() async {
print("当前线程:"+ Isolate.current.debugName);
// 声明ReceivePort对象用来监听回调的数据
var receivePort = new ReceivePort();
// 两个isolate之间通过SendPort来进行通信
await Isolate.spawn(entryPoint, receivePort.sendPort);
/* 接收方式 1 */
// 意思是第一次接收到消息
SendPort sendPort = await receivePort.first;
// 用子线程发送过来的SendPort对象-发送数据,-》子线程就会收到通知
sendPort.send("回复给子线程的内容");
/* 接收方式 2 */
receivePort.listen((message) {
SendPort sendPort = message;
// 用子线程发送过来的SendPort对象-发送数据,-》子线程就会收到通知
sendPort.send("回复给子线程的内容");
// 关闭监听
receivePort.close();
});
}
void entryPoint(SendPort sendPort) async {
// 创建跟当前线程关联的ReceivePort对象
var port = new ReceivePort();
// 把SendPort对象发送到主线程
sendPort.send(port.sendPort);
// 这里是接收到 主线程给回复的内容
await for (var data in port) {
print("data $data");
}
}
Isolate.spawnUri 创建形式
mainIsolate.dart文件中
import 'dart:isolate';
main() {
//启动应用
start();
//创建新线程
newIsolate();
//项目初始化
init();
}
void start(){
print("启动应用" + DateTime.now().microsecondsSinceEpoch.toString());
}
void newIsolate() async {
print("创建新线程");
ReceivePort r = ReceivePort();
SendPort p = r.sendPort;
//创建新线程
Isolate childIsolate = await Isolate.spawnUri(
Uri(path: "childIsolate.dart"),//这里引用的是文件路径
["data1", "data2", "data3"],//这里传参就是文件方法中接收到args
p);//这里的p就是文件方法中接收的SendPort对象
r.listen((message) {
print("主线程接收到数据:" + message[0]);
if (message[0] == 0){
//异步任务开始
} else if (message[1] == 1){
//异步任务正在处理
} else if (message[2] == 2){
//异步任务完成
//取消监听
r.close();
//杀死新线程,释放资源
childIsolate.kill();
}
});
}
void init() {
print("项目初始化");
}
childIsolate.dart文件中
import 'dart:io';
import 'dart:isolate';
main(List<String> args, SendPort mainSendPort) {
print("新线程接收到的参数:$args");
//发送数据到主线程
mainSendPort.send(["开始异步操作", 0]);
//延时3秒
sleep(Duration(seconds: 3));
//发送数据到主线程
mainSendPort.send(["加载中", 1]);
//延时3秒
sleep(Duration(seconds: 3));
//发送数据到主线程
mainSendPort.send(["异步任务完成", 2]);
}