isolate 通信

博客包含main.dart和isolates.dart文件相关内容,为转载自https://www.cnblogs.com/pythonClub/p/10822365.html的信息,与信息技术相关。

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_isolate/flutter_isolate.dart';
import 'isolates.dart';
import 'dbhelper.dart';
import 'package:rxdart/rxdart.dart';
import 'dart:isolate';


void main() {
  runApp(MaterialApp(
    title: 'Flutter Demo',
    initialRoute: '/',
    routes: {
      '/':(context)=>MyApp(),
      '/second':(context)=>NextPage(),
    },
  ));
}

class MyApp extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return MyAppState();
  }
}
class MyAppState extends State<MyApp> {
  FlutterIsolate isoltex;
  DataBloc bloc = DataBloc();
  ReceivePort toChild;
  DB db = DB();

  addData()async{
    var a = await db.addData('type', {'name':'11maintest'});
    print(a);
  }

  checkData()async{
    var b = await db.queryData('SELECT * FROM type');
    print(b);
  }
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(title: Text('sss'),),
      body: Container(child: Column(
          children: <Widget>[
            StreamBuilder(
              stream: bloc.dataBloc.stream,
              builder: (context, snapshot){
                if(snapshot.hasData){
                  return Text('${snapshot.data}');
                }else{
                  return Text('pending..');
                }
              },
            ),
            RaisedButton(child: Text('addData'),onPressed: ()async{
              addData();
            },),
            RaisedButton(child: Text('check data'),onPressed: ()async{
              checkData();
            },),
            RaisedButton(child: Text('start'),onPressed: ()async{
              isoltex = await createIsolate(bloc,'abc');
            },),
            RaisedButton(child: Text('pause'),onPressed: (){
              isoltex.pause();
            },),
            RaisedButton(child: Text('resume'),onPressed: (){
              isoltex.resume();
            },),
            RaisedButton(child: Text('kill'),onPressed: (){
              isoltex.kill();
            },),
            RaisedButton(child: Text('go to next'),onPressed: (){
              Navigator.of(context).pushNamed('/second');
            },)

          ]),
      ),
    );
  }
}


class NextPage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('page2'),),
      body: Container(
        child: RaisedButton(child:Text('btn'),
            onPressed: (){
              print('hello');
            }),
      ),
    );
  }
}

class DataBloc {
  ReplaySubject dataBloc = ReplaySubject();

}

  

isolates.dart

import 'package:flutter_isolate/flutter_isolate.dart';
import 'dart:async';
import 'dart:isolate';
import 'main.dart';

Future<FlutterIsolate> createIsolate(DataBloc bloc, String type) async {
  ReceivePort receivePort = ReceivePort();
  ReceivePort fromChild = ReceivePort();
  FlutterIsolate isolate = await FlutterIsolate.spawn(isolateEntry, receivePort.sendPort);
  SendPort t = await receivePort.first;
  t.send({'sender':fromChild.sendPort,'msg':type});
  fromChild.listen((value){
    bloc.dataBloc.add(value);
  });
  return isolate;
}


isolateEntry(SendPort sendPort)async{
  ReceivePort port = ReceivePort();
  sendPort.send(port.sendPort);

  port.listen((data)async{
    print('son $data');
    await doWork(data['msg'], data['sender']);
  });
}

Future doWork(data, SendPort s)async{
  print('start working');
  int i = 0;
  while(i<10){
    s.send('$data : $i');
    await Future.delayed(Duration(seconds: 1));
    i++;
  }
}

  

转载于:https://www.cnblogs.com/pythonClub/p/10822365.html

### Flutter 中 Isolate 的详细用法和工作原理 #### 什么是 IsolateIsolate 是 Dart 编程语言中的一个重要概念,它表示一个独立的工作单元。每个 Isolate 都有自己的内存空间、事件循环以及任务队列[^1]。这意味着不同 Isolate 之间的数据无法直接共享,通信通常依赖消息传递机制。 #### Isolate 的创建方式 在 Flutter 和 Dart 中,可以通过两种主要方法创建一个新的 Isolate: 1. **`Isolate.spawn()` 方法** `Isolate.spawn()` 提供了一种简单的方式来启动新 Isolate 并执行指定函数。 ```dart import 'dart:isolate'; void entryPoint(SendPort sendPort) { int result = expensiveComputation(); sendPort.send(result); } Future<void> main() async { ReceivePort receivePort = ReceivePort(); await Isolate.spawn(entryPoint, receivePort.sendPort); int result = await receivePort.first as int; print('Result from isolate: $result'); } ``` 上述代码展示了如何通过 `Isolate.spawn()` 启动一个新 Isolate 来处理耗时任务,并通过消息通道接收结果。 2. **`compute()` 函数** 对于简单的场景,推荐使用 Flutter 提供的便捷工具——`compute()` 函数。该函数封装了 Isolate 的复杂细节,允许开发者轻松地将耗时任务移交给后台线程。 ```dart import 'package:flutter/foundation.dart'; import 'dart:async'; Future<int> performCalculation(int input) async { // Simulate a long-running task. await Future.delayed(Duration(seconds: 2)); return input * 2; } Future<void> main() async { final result = await compute(performCalculation, 42); print('Computed Result: $result'); // 输出 Computed Result: 84 } ``` 此处利用 `compute()` 将计算逻辑放入另一个 Isolate 执行,从而避免阻塞主线程。 #### Isolate 工作原理剖析 Dart VM 实现了多 Isolate 支持,其中每一个 Isolate 都拥有自己的堆栈结构与独立运行环境。这种设计使得即使某个 Isolate 发生崩溃也不会影响其他正在工作的 Isolate 或整个应用进程[^4]。 当调用 `Isolate.spawn()` 或者 `compute()` 时,实际上是在当前应用程序上下文中请求 Dart VM 创建额外的隔离区 (即新的 Isolate),并将目标函数及其参数序列化后发送给这个新区域去执行。完成后,再把结果反向传回原调用方所在区域。 需要注意的是,在同一进程中所有的 Isolates 共享同一个物理 CPU 核心资源池;因此即便启用了多个 Isolates,也不能超越设备硬件能力范围之外获得无限性能提升。 另外值得注意的一点在于,虽然 Isolate 能够有效解决 UI 卡顿等问题,但它并不适合频繁短时间内的大量并发操作,因为每次新建销毁都会带来一定开销成本。对于这类需求,则更倾向于采用基于单线程模型下的微任务调度方案如 Futures 结合 Async/Await 关键字来达成目的。 #### 总结 综上所述,Flutter 应用程序默认在一个单独的 Isolate 下运作,而面对可能引起界面冻结的大规模运算或长时间等待 I/O 操作等情况时,可借助 Isolate 技术手段予以缓解优化。具体实践过程中既可以选择手动管理 Isolate 生命周期的方式 (`Isolate.spawn`) ,也能采纳更为简洁高效的高级 API —— `compute()` 。不过无论采取哪种途径都需权衡利弊考虑实际应用场景特点做出合理决策[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值