Dart异步编程:一、认识任务

前言

任务就像是程序里的一个个小包裹,每个包裹都有自己的内容和去向。比如,当你在手机应用里点击一个按钮去获取网络数据,这个获取数据的操作就是一个任务。它有自己的起点(你点击按钮的时候),过程(网络传输数据),和终点(数据到达你的手机)。

在Dart里,任务被定义为一个独立的工作单元,它可以是一个简单的计算,也可以是一个复杂的网络请求。任务可以被并发或者并行执行,这意味着在合适的条件下,多个任务可以同时进行,从而提高程序的效率。

基础概念

Dart中的任务主要分为同步任务微任务事件任务I/O回调任务渲染任务

1. 同步任务

同步任务就像是你直接去商店买东西,买完就走,不会等待其他事情完成。它会直接在当前线程中执行,直到完成为止。

dart 复制代码
void syncTask() {
  print("同步任务开始");
  // 同步操作
  print("同步任务结束");
}

2. 微任务

微任务则像是你提前预约的服务,它会在所有同步任务完成后第一时间处理。微任务具有最高的优先级,适用于需要立即执行的异步操作。

dart 复制代码
void scheduleMicrotaskExample() {
  scheduleMicrotask(() {
    print("微任务执行");
  });
}

3. 事件任务

事件任务和I/O回调任务则更像是你打电话预约,等对方准备好后再来处理。事件任务是标准优先级的异步任务(优先级比微任务低)。

dart 复制代码
Future<void> eventTask() async {
  print("事件任务开始");
  // 模拟异步操作
  await Future.delayed(Duration(seconds: 1));
  print("事件任务结束");
}

4. I/O回调任务

I/O回调任务是由系统事件触发的任务,例如文件读取完成后的回调。

dart 复制代码
void ioCallbackTask() {
  File("example.txt").readAsString().then((String contents) {
    print("I/O回调任务完成,文件内容为:$contents");
  });
}

5. 渲染任务

渲染任务则是在特定的时间点,比如屏幕刷新的时候,来更新界面。

dart 复制代码
void renderTask() {
  WidgetsBinding.instance.scheduleFrame();
}

任务的调度与管理

任务的调度就像是一个交通指挥官,决定着哪个任务先执行,哪个任务后执行。常见的调度策略有先来先服务、轮转调度和优先级调度。在Dart里,任务的调度主要通过事件循环来实现,它就像是一个永不停歇的邮递员,不断地从任务队列里取出任务并执行。

代码示例:

dart 复制代码
void eventLoopExample() {
  print("主线程开始");

  // 微任务
  scheduleMicrotask(() {
    print("微任务1");
  });

  // 异步任务
  Future.delayed(Duration(seconds: 0), () {
    print("异步任务1");
  });

  // 再次添加微任务
  scheduleMicrotask(() {
    print("微任务2");
  });

  print("主线程结束");
}

//输出结果:
主线程开始
主线程结束
微任务1
微任务2
异步任务1

事件循环的执行顺序

在 Dart 的事件循环中,执行顺序如下:

  1. 同步代码:首先执行所有同步代码。
  2. 微任务队列:然后依次执行微任务队列中的所有微任务。
  3. 事件队列:最后执行事件队列中的异步任务。

同步与异步的区别

同步就像是你排队买奶茶,必须站在那里等奶茶做好才能离开,整个过程是顺序的,不能做其他事情。而异步则像是你扫码点奶茶,点完后可以去做其他事情,奶茶做好后会通知你来取。在Dart里,同步任务会阻塞后续代码的执行,而异步任务则不会,它可以让程序在等待某个任务完成的同时继续执行其他代码。

同步与异步示例

dart 复制代码
// 同步示例
void synchronousExample() {
  print("同步操作开始");
  // 模拟耗时操作
  for (var i = 0; i < 100000000; i++) {}
  print("同步操作结束");
}

// 异步示例
void asynchronousExample() async {
  print("异步操作开始");
  // 模拟异步耗时操作
  await Future.delayed(Duration(seconds: 2));
  print("异步操作结束");
}

异步编程的优势

异步编程的优势在于它能够提高程序的效率和响应速度。比如在处理网络请求时,如果使用同步方式,程序会一直等待网络数据返回,期间无法执行其他操作。而使用异步方式,程序可以在等待数据的同时继续处理其他任务,当数据返回时再通过回调函数来处理结果。

任务的生命周期

任务的生命周期通常包括以下几个阶段:

  1. 创建(Created) : 任务被定义或创建,但尚未开始执行。

  2. 等待(Pending) :任务已经准备好,等待执行。

  3. 运行中(Running) :任务正在执行中。

  4. 完成(Completed) :任务

在 Dart 中,异步任务的生命周期可以通过 Future 的状态来理解。以下是任务生命周期的流程图描述:

八、总结

在 Dart 中,任务分为同步任务、微任务、事件任务、I/O 回调任务和渲染任务,它们通过事件循环进行调度,顺序为先执行同步代码,再依次执行微任务队列和事件队列中的任务,其中异步编程能提高程序效率和响应速度,任务从创建到完成会经历创建、等待、运行中和完成四个阶段。

相关推荐
*才华有限公司*18 小时前
安卓前后端连接教程
android
氦客18 小时前
Android Compose中的附带效应
android·compose·effect·jetpack·composable·附带效应·side effect
雨白19 小时前
Kotlin 协程的灵魂:结构化并发详解
android·kotlin
我命由我1234519 小时前
Android 开发问题:getLeft、getRight、getTop、getBottom 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Modu_MrLiu19 小时前
Android实战进阶 - 用户闲置超时自动退出登录功能详解
android·超时保护·实战进阶·长时间未操作超时保护·闲置超时
Jeled19 小时前
Android 网络层最佳实践:Retrofit + OkHttp 封装与实战
android·okhttp·kotlin·android studio·retrofit
信田君952719 小时前
瑞莎星瑞(Radxa Orion O6) 基于 Android OS 使用 NPU的图片模糊查找APP 开发
android·人工智能·深度学习·神经网络
tangweiguo0305198720 小时前
Kotlin 实现 Android 网络状态检测工具类
android·网络·kotlin
nvvas21 小时前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
怪兽201421 小时前
Android多进程通信机制
android·面试