美文网首页
Flutter 异步编程

Flutter 异步编程

作者: 波澜步惊 | 来源:发表于2019-03-12 16:36 被阅读9次

    前言

    Flutter框架使用的编程语言是 dart. dart中太基础的我就不写了,写点和java不一样的地方。

    异步编程,相对于Android JavaFlutter dart是单线程运行app的,也可以说,Flutter没有多线程的概念,那么app一定会有异步网络请求这种场景,那么怎么实现呢? 新的概念:Isolate .

    正文

    flutterIsolate.png

    这是 Flutter 社区对 Isolate的描述,emmmm,真够简洁的。总之一句话,isolate是内存隔离的堆内存区,多个isolate之间不能进行内存共享。

    一张图说明一切:


    Isolate概念.png

    示例代码:

    import 'dart:isolate';
    
    int i;
    
    //看到这个main函数没?它作为入口函数,它本身也是在一个isolate内部运行。
    void main() {
      //Isolate的概念,利用 彼此隔离的堆内存,运行异步任务。 多个isolate之间可以相互通信。
      ReceivePort receiverPort = new ReceivePort(); // 卧槽,怎么没有代码提示
      //这个时候拿到了一个当前isolate的接收端口
    
      //创建一个另外的Isolate,老叫英文挺别扭的,就叫你吧
      //创建,第一个参数是 一个Function ,方法,可以传匿名方法,也可以自定义
      Isolate.spawn(entryPoint, receiverPort.sendPort);
      //这样就新创建了一个,并且把main这个的sendPort传给了它,让main可以传消息到 新创建的
    
      receiverPort.listen((t) {//dart的一个isolate的运行过程,也是通过事件驱动的,通过事件队列的循环,来响应各种变化。
        if (t is SendPort) {
          print("main给B发送消息 ,内容为:收到收到");
          t.send(
              "收到收到!"); //我这里拿到了B的sendPort,也给他发了消息,但是B并没有收到。为啥?因为B并没有注册监听呀。擦?
        } else
          print("main接收到 B  发来的消息~~~~~" + t);
      });
    
    //  sleep(Duration(seconds: 2)); //由于这里是单线程,所以main函数这个,要执行lis中的内容,也必须要等休眠结束
    //  print("main睡眠结束"); //
    
    }
    
    //参数:sendPort 是main函数所在的传过来的sendPort,所以,当前这个可以用它来向main传信
    void entryPoint(SendPort sendPort) {
      print("B 给main发送消息 ,内容为:我是B,我给main 发消息啦");
      sendPort.send("我是B,我给main 发消息啦"); //  但是我传了,main没收到?是的,main并没有注册监听器
    
      ReceivePort receiverPort = new ReceivePort();
      sendPort.send(receiverPort.sendPort); //但是我们要实现双向通信,那就必须,把B的sendPort给main
    
      receiverPort.listen((t) {
        print("B接收到 main 的消息~~~~~" + t);
      });
    }
    
    

    打印的日志

    B 给main发送消息 ,内容为:我是B,我给main 发消息啦
    main接收到 B 发来的消息~~~~~我是B,我给main 发消息啦
    main给B发送消息 ,内容为:收到收到
    B接收到 main 的消息~~~~~收到收到!

    相关文章

      网友评论

          本文标题:Flutter 异步编程

          本文链接:https://www.haomeiwen.com/subject/hksgpqtx.html