• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter Dart语言05异步

武飞扬头像
图王大胜
帮助1

0 说明

该系列教程主要是为有一定语言基础 C/C 的程序员,快速学习一门新语言所采用的方法,属于在C/C 基础上扩展新语言的模式。

1 async和await

在Dart语言中,虽然没有像其他语言(如Java、C 、Python)中的传统多线程概念,但它采用了异步(asynchronous)编程模型来处理并发任务。Dart使用async和await关键字来支持异步操作,这可以在很大程度上达到类似多线程的效果,但实际上是基于单线程的事件循环机制。

异步主要涉及2个关键词:async和await。async 是让方法变成异步,await是等待异步方法执行完。两个关键字的约束如下:

  • 只有async方法才能使用await关键字去调用方法。
  • 如果调用别的async方法必须使用await关键字。

这里以一个http服务为例来解读这两个关键字的使用,代码如下所示:

  1.  
    import 'dart:convert';
  2.  
    import 'package:http/http.dart' as http;
  3.  
     
  4.  
    void main() async {
  5.  
    // 发起HTTP GET请求
  6.  
    final response = await http.get(
  7.  
    Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
  8.  
     
  9.  
    if (response.statusCode == 200) {
  10.  
    final responseData = json.decode(response.body);
  11.  
    print('Title: ${responseData['title']}');
  12.  
    print('Body: ${responseData['body']}');
  13.  
    } else {
  14.  
    print('Request failed with status: ${response.statusCode}');
  15.  
    }
  16.  
    }
学新通

2 隔离 Isolate机制

在Dart中本身是没有多进程概念的,但可以使用Isolate隔离机制来实现多进程效果。Isolate是一种轻量级的并发执行单元,可以在不同的线程中运行代码(说明:每个isolate 都有一个完整的事件循环机制,每个隔离区都有自己的内存堆,确保每个隔离区的状态都不会被其他隔离区访问,隔离这种机制更像是进城而非线程)。这里制作一个demo,模拟 主线程循环输出aaa,子线程循环输出bbb,各输出5次,代码实现如下所示:

  1.  
    import 'dart:isolate';
  2.  
     
  3.  
    void main() {
  4.  
    startChildIsolate();
  5.  
     
  6.  
    for (var i = 0; i < 5; i ) {
  7.  
    print("aaa");
  8.  
    sleep(Duration(seconds: 1));
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    void startChildIsolate() async {
  13.  
    final isolate = await Isolate.spawn(childIsolate, null);
  14.  
    }
  15.  
     
  16.  
    void childIsolate(dynamic message) {
  17.  
    for (var i = 0; i < 5; i ) {
  18.  
    print("bbb");
  19.  
    sleep(Duration(seconds: 1));
  20.  
    }
  21.  
    }
学新通

命令执行效果如下所示:

  1.  
    Connecting to VM Service at ws://127.0.0.1:59390/qHZyzE0WjeQ=/ws
  2.  
    aaa
  3.  
    bbb
  4.  
    aaa
  5.  
    bbb
  6.  
    aaa
  7.  
    bbb
  8.  
    aaa
  9.  
    bbb
  10.  
    ---------

3 Isolate 隔离-双向通讯

这里主要通过Isolate机制构建了一个主线程和一个子线程并进行双向通信,主要使用SendPort和ReceivePort。代码实现如下:

  1.  
    import 'dart:isolate';
  2.  
     
  3.  
    var anotherIsolate;
  4.  
     
  5.  
    void startMainIsolate() async {
  6.  
    var receivePort = ReceivePort();
  7.  
    var sendPort;
  8.  
     
  9.  
    anotherIsolate = await Isolate.spawn(threadIsolateInit, receivePort.sendPort);
  10.  
     
  11.  
    receivePort.listen((date) {
  12.  
    if (date is SendPort) {
  13.  
    sendPort = date;
  14.  
    print("双向通讯建立成功");
  15.  
    return;
  16.  
    }
  17.  
    print("主线程 接收消息:data = $date");
  18.  
    sendPort.send("XXXXX");
  19.  
    });
  20.  
    }
  21.  
     
  22.  
    void threadIsolateInit(SendPort sendPort) async {
  23.  
     
  24.  
    var receivePort = ReceivePort();
  25.  
    print("子线程 接受到来自 主线程的port,尝试建立同主线程的双向通讯");
  26.  
     
  27.  
    receivePort.listen((date) {
  28.  
    print("子线程接收消息:data = $date");
  29.  
    });
  30.  
     
  31.  
    sendPort.send(receivePort.sendPort);
  32.  
     
  33.  
    for (var index = 0; index < 10; index ) {
  34.  
    sendPort.send("子线程 发送消息:$index");
  35.  
    }
  36.  
    }
  37.  
     
  38.  
    void main() {
  39.  
    startMainIsolate();
  40.  
    }
学新通

运行效果如下:

  1.  
    onnecting to VM Service at ws://127.0.0.1:60037/CvPyFfwECy8=/ws
  2.  
    子线程 接受到来自 主线程的port,尝试建立同主线程的双向通讯
  3.  
    双向通讯建立成功
  4.  
    主线程 接收消息:data = 子线程 发送消息:0
  5.  
    主线程 接收消息:data = 子线程 发送消息:1
  6.  
    主线程 接收消息:data = 子线程 发送消息:2
  7.  
    主线程 接收消息:data = 子线程 发送消息:3
  8.  
    子线程接收消息:data = XXXXX
  9.  
    主线程 接收消息:data = 子线程 发送消息:4
  10.  
    子线程接收消息:data = XXXXX
  11.  
    主线程 接收消息:data = 子线程 发送消息:5
  12.  
    子线程接收消息:data = XXXXX
  13.  
    主线程 接收消息:data = 子线程 发送消息:6
  14.  
    子线程接收消息:data = XXXXX
  15.  
    主线程 接收消息:data = 子线程 发送消息:7
  16.  
    子线程接收消息:data = XXXXX
  17.  
    主线程 接收消息:data = 子线程 发送消息:8
  18.  
    子线程接收消息:data = XXXXX
  19.  
    主线程 接收消息:data = 子线程 发送消息:9
  20.  
    子线程接收消息:data = XXXXX
  21.  
    子线程接收消息:data = XXXXX
  22.  
    子线程接收消息:data = XXXXX
  23.  
    子线程接收消息:data = XXXXX
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcbaib
系列文章
更多 icon
同类精品
更多 icon
继续加载