创建Isolate 的两种方法:
Isolate.spawn[dart里面的] 和 compute()[flutter里面的]
上面的两个函数使用方法和传入的参数方式都一样,一个是dart里面的一个是flutter里面的。
第一个参数:静态方法,或顶级函数
第二个参数:可以传入任何类型的值,比如官方的:List Map String int bool
Isolate.spawn((message) { //打印传入的参数 print(message); }, '要传入的参数');
Isolate 单项通信:
//创建单向通信隔离
Future<void> createOneWayCommunicationIsolation() async {
//打印下当Isolate的名称 //main
print(Isolate.current.debugName);
//创建接收端口
final ReceivePort receivePort = ReceivePort();
//创建发送端口
SendPort sendport = receivePort.sendPort;
//接收新新线程发来的消息[两种监听方法只能同时使用一种]
//第一种监听方法
receivePort.listen((message) {
print(message); // 这是发给主线程的消息
});
//第二种监听方法
// var msg = receivePort.first;
//创建隔离 【第二个参数是,把创建的发送端口传过去】
Isolate.spawn((sendport) {
//打印下当Isolate的名称
print(Isolate.current.debugName); //自定义隔离名称
//发送消息给主线程
sendport.send('这是发给主线程的消息');
}, sendport, debugName: '自定义隔离名称');
}
Isolate 双向通信:
//创建双向通信隔离
void createTwoWayCommunicationIsolation() {
//打印下当Isolate的名称 //main
print(Isolate.current.debugName);
//创建接收端口
final ReceivePort r1 = ReceivePort();
//创建发送端口
SendPort s1 = r1.sendPort;
//接收新新线程发来的消息[两种监听方法只能同时使用一种]
//第一种监听方法
r1.listen((message) {
SendPort s = message[0];
String d = message[1];
print('接收到新线程发来的消息:$d'); //接收到新线程发来的消息:这是发给主线程的消息
s.send('这是发给子线程的消息');
});
//第二种监听方法
// var msg = receivePort.first;
///创建隔离 【第二个参数是,把创建的发送端口传过去】
Isolate.spawn((sendport) {
//打印下当Isolate的名称
print(Isolate.current.debugName); //自定义隔离名称
// 创建接收端口
final ReceivePort r2 = ReceivePort();
//创建发送端口
SendPort s2 = r2.sendPort;
///监听主线程发来的消息
r2.listen((message) {
print('接收到主线程发来的消息:$message'); //接收到主线程发来的消息:这是发给子线程的消息
});
///把新线程创建的发送端口传给主线程
sendport.send([s2, '这是发给主线程的消息']);
}, s1, debugName: '自定义隔离名称');
}
IsolateNameServer.registerPortWithName 和 IsolateNameServer.lookupPortByName 的使用:
static Future<void> createIsolate() async {
//创建接收端口
ReceivePort receivePort = ReceivePort();
//监听接收端口
receivePort.listen((message) {
print('隔离返回的数据:$message');
//隔离返回的数据:主线程发送给接收端口的数据
//隔离返回的数据:这是新线程发送给主线程接收端口的数据
});
//通过名称注册发送端口
IsolateNameServer.registerPortWithName(receivePort.sendPort, 'zhao');
//通过昵称查找发送端口,然后发送数据
IsolateNameServer.lookupPortByName('zhao')?.send('主线程发送给接收端口的数据');
//创建隔离
Isolate.spawn((message) {
//通过昵称查找发送端口,然后发送数据
IsolateNameServer.lookupPortByName(message)?.send('这是新线程发送给主线程接收端口的数据');
}, 'zhao');
//删除注册的发送端口
IsolateNameServer.removePortNameMapping('zhao');
}
其他方法:
ReceivePort receivePort = ReceivePort();
//关闭接收端口。
// 接收端口将不再接收任何事件,也不会作为流事件发出。
// 如果已调用listen且StreamSubscription尚未取消,则订阅将通过“完成”事件关闭。
// 如果流已被取消,则此方法无效
receivePort.close();
//将消息发送到此接收端口的SendPort 。
SendPort s = receivePort.sendPort;
//发送消息
s.send('message');
//表示当前隔离的Isolate对象
Isolate.current;
//获取当前线程的名称
Isolate.current.debugName;
//获取获取当前线程的发送端口并发送消息
Isolate.current.controlPort.send('message');
//请求隔离关闭。
// 隔离被请求终止自身。 priority参数指定何时必须发生。
// priority在提供时必须是immediate或beforeNextEvent之一(默认值)。关闭根据优先级在不同时间执行:
Isolate.current.kill();
// 同步终止当前隔离。
// 此操作具有潜在危险,应谨慎使用。隔离立即停止运行。
Isolate.exit();
THE END