Flutter 简化线程Isolate的使用


前言

flutter的线程是数据独立的,每个线程一般通过sendport来传输数据,这样使得线程调用没那么方便,本文将提供一种支持lambda启动isolate的方法,且支持捕获值类型变量,以及支持返回值。


一、完整代码

由于代码量较少,原理就不介绍了,直接给出完整实现。
isolate_helper.dart

///在隔离中执行任务,只能捕获值,不能捕获引用或指针。
///需要注意成员方法中调用传lambda会自动捕获this,this中包含引用类型则不行,此时可修改为static方法中调用。
Future<T> isolateFuture<T>(T Function() isolateEntry) async {
  ReceivePort receivePort = ReceivePort();
  //创建一个Isolate相当于创建一个子线程
  await Isolate.spawn((message) {
    message.sendPort.send(message.isolateEntry());
  }, _IsolateMessage(isolateEntry, receivePort.sendPort));
  var ret = await receivePort.first as T;
  return ret;
}

class _IsolateMessage<T> {
  T Function() isolateEntry;
  SendPort sendPort;
  _IsolateMessage(this.isolateEntry, this.sendPort);
}

二、使用示例

1、通过lambda启动线程

void test() {
  String a = "hello word!";
  isolateFuture(() {
    //在子线程中执行任务,捕获(拷贝)了变量a。
    print("${Isolate.current.hashCode} $a");
  });
  print("${Isolate.current.hashCode} $a");
}

在这里插入图片描述

2、获取线程返回值

Future test1() async {
  String a = await isolateFuture(() {
    //在子线程中执行任务:略
    //返回结果
    return "hello word!";
  });
  print(a);
}

在这里插入图片描述

3、线程通信

void test2() {
  ReceivePort mainReceivePort = ReceivePort();
  SendPort isolateSendPort;
  mainReceivePort.listen((message) {
    //监听子线程的消息
    switch (message[0]) {
      case 0:
        print(message[1]);
        break;
      case 1:
        isolateSendPort = message[1];
        isolateSendPort.send([0, "hello word!"]);
        break;
    }
  });
  //sendport是可以直接捕获传给isolate的。
  final mainSendPort = mainReceivePort.sendPort;
  isolateFuture(() {
    //发送消息给主线程
    mainSendPort.send([0, "hello word!"]);
    ReceivePort isolateReceivePort = ReceivePort();
    isolateReceivePort.listen((message) {
      //监听主线程的消息
      switch (message[0]) {
        case 0:
          print(message[1]);
          break;
      }
    });
    //将sendPort发送到主线程,建立双向通信
    mainSendPort.send([1, isolateReceivePort.sendPort]);
  });
}

在这里插入图片描述

4、结束isolate

Future test1() async {
  String a = await isolateFuture(() {
    //isolate结束时建议手动kill,即此方法返回后isolate并不会结束,所以支持异步操作。返回后没有任何操作了gc似乎会清理isolate。
    Isolate.current.kill();
    return "hello word!";
  });
  print(a);
}

总结

以上就是今天要讲的内容,本文的提供线程启动方法,很大程度方便了使用,尤其是支持lambda,可以在任意上下文捕获变量开启线程,执行任务,并获取返回值,用法和Future就很类似了,可以当成异步的另一种选择。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Flutter是一种基于Dart编程语言的移动应用开发框架。由于移动应用通常需要处理大量数据和网络请求等复杂任务,因此Flutter对于多线程的支持非常重要。 Flutter提供了Dart的异步编程机制,包括async/await和Future/Promise等。使用这些机制可以在不阻塞应用程序的情况下执行耗时任务。这样做可以提高UI的响应性以及应用程序的用户体验。 Flutter还内置了Isolate,这是Dart中的一个非常强大的多线程工具。Isolate提供了一种在不同进程之间传递数据的方式,可以大大简化多线程编程的复杂度。Flutter中的Isolate可以执行在后台进行耗时任务,例如处理图像或音频等任务,从而提高整个应用程序的性能和响应性。 除了内置的IsolateFlutter还提供了用于管理和调度多线程任务的工具。例如,Flutter Scheduler可以控制UI和其他后台任务的执行时间,以确保应用程序的资源得到有效的利用。Flutter中的并行任务也可以基于线程池执行,这将更好地分配任务和管理资源。 总之,Flutter提供了多种方法来处理复杂的任务,并在多线程编程方面提供了重要的支持。同时,开发人员还应该理解多线程编程的挑战和最佳实践,并根据应用程序的需求进行合理的设计和实现。 ### 回答2: Flutter提供了许多不同的方式来执行多线程操作,包括像Isolate和Compute这样的API,以及使用Dart语言中的Async / Await关键字执行异步操作的选项。 其中,IsolateDart语言中的一种轻量级线程模型,它允许我们在代码中同时运行多个任务而不会阻塞主线程使用Isolate,我们可以并发地运行多个任务,通过消息通信在它们之间传递数据。它们之间相互独立,可避免在一个线程中执行长时间运行的操作影响应用程序响应性能。 与Isolate不同,Compute API是Flutter框架提供的方法。如Isolate API,开发人员可以通过Compute通过将函数作为参数传递来创建并行计算。每个行为都会在自己的Isolate中执行,因此它们之间不会影响对资源的访问。此外,Flutter还提供了Future和Async / Await的方式来进行任务的并行处理和异步代码的管理。 综上所述,Flutter提供了多种执行多线程操作的方式,包括Isolate和Compute API、Future和Async / Await等。在实际开发中,我们应根据具体需求选择合适的方式来进行多线程操作,提高应用程序的响应性能和并行计算的速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeOfCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值