Flutter异步编程详解

本文深入探讨Dart/Flutter的异步编程,讲解Isolate的概念及其在移动开发中的作用,如何避免Main Isolate中的耗时操作导致的UI卡顿。同时介绍了Event Loop的工作原理,帮助开发者理解异步任务处理和调度。文章还提供了多线程间通信的示例,以及Future和async/await的使用技巧。
摘要由CSDN通过智能技术生成

不知道大家有没有一个疑问:Dart是单线程执行,那它是如何实现异步操作的呢?

本文将对Dart/Flutter提供的Isolate,Event Loop,Future,async/await等进行异步操作相关的知识点进行分析。

Isolate

什么是Isolate?

An isolate is what all Dart code runs in. It’s like a little space on the machine with its own, private chunk of memory and a single thread running an event loop.

  • Isolate相当于Dart语言中的线程Thread,是Dart/Flutter的执行上下文环境(容器);
  • Isolate有自己独立的内存地址和Event Loop,不存在共享内存所以不会出现死锁,但是比Thread更耗内存;

  • Isolate间不能直接访问,需凭借Port进行通信;

Main Isolate

当执行完main()入口函数后,Flutter会创建一个Main Isolate。一般情况下任务都是在这个Main Isolate中执行的。

多线程

一般情况下在Main Isolate执行任务是可以接受的,但是把一些耗时操作放在Main Isolate中执行,会造成掉帧的现象,这会对用户体验造成严重影响。此时,选择将耗时任务分发到其他的Isolate中就是一个很好的实现方式了。

所有的Dart Code都是在Isolate中执行的,代码只能使用同一个Isolate中的内容,不同的 Isolate是内存隔离的,因此只能通过 Port 机制发送消息通信,其原理是向不同的 Isolate 队列中执行写任务。

案例

我们做了个简单的Demo,屏幕中间有一个心在不停的动画(由小变大,再由大变小)。当我们点击右下角对的加号按钮,会进行一个耗时的运算。如果耗时操作在Main Isolate执行,将会造成界面的丢帧,动画将会出现卡顿的情况。

我们目前就是需要解决这个掉帧的问题。

1.compute 方法

Flutter封装了一个compute这个高级API函数可以让我们方便的实现多线程的功能。

Future<R> compute<Q, R>(isolates.ComputeCallback<Q, R> callback, Q message, { String? debugLabel }) async {
}

compute接收两个必传参数:1,需要执行的方法;2,传入的参数,这参数最多只能是1个,所以多个参数需要封装到Map中;

  • 最开始的代码
// 耗时操作的方法:`bigCompute`
Future<int> bigCompute(int initalNumber) async {
    int total = initalNumber;
    for (var i = 0; i < 1000000000; i++) {
      total += i;
    }
    return total;
}

// 点击按钮调用的方法:`calculator`
void calculator() async {
    int result = await bigCompute(0);
    print(result);
}

// FloatingActionButton的点击事件
FloatingActionButton(
    onPressed: calculator,
    tooltip: 'Increment',
    
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值