美文网首页
ReceivPort,线程和ui通信

ReceivPort,线程和ui通信

作者: 晓函 | 来源:发表于2023-04-25 11:10 被阅读0次

在c++中Thread可以通过SendMessage和UI通信,达到更新ui的目的。
flutter也有对应的方式,ReceivPort()

ReceivPort()

比如在线程中和ui进行频繁通信,比如一个计算量超级大的方法,你需要把每个计算进度都返回给ui并显示出来。这是ReceivePort就要出场了,可以用在isolate和compute,可以把它想象成websocket,是可以双向通信的,只需要建立ReceivePort()就行了。

isolate和compute区别
isolate不直接返回结果,需要双向通信来获知结果,可以长时间运行
compute结束后会返回结果,比较适合单向通信,一次性任务

详解

  1、【UI】创建接收端口,recvPort是可以进行listen的
  var recvPort = ReceivePort();
  2、【UI】监听listen后就能接收线程消息了
  recvPort.listen((msg){  });//接收线程消息
  3、【UI】创建线程时候,把接收端口的另一端(recvPort.sendPort)发给线程
  compute(func,recvPort.sendPort)
  4、【Thread】线程中就可以通过sendPort发消息外ui了
  sendPort.send('hello')

简单例子

class MyData{
  SendPort sendPort;
  int n;
  MyData(this.sendPort,this.n);
}

//耗时的计算方法
int go(MyData data){
      print('data.n:${data.n}');
      for(int i=0;i<10;i++){
        sleep(Duration(seconds:1));
        //发送百分比
        data.sendPort.send({'progress':'hello world,progress:$i %'});
      }

      //上面实现了单向通信:线程发送msg给外面。
      //如果要双向通信,接收外部命令:
      //1、创建接收端口
      //var recvPort = ReceivePort();
      //2、把接收端口的另一端发给外面
      //data.sendPort.send({'recv_port':recvPort.sendPort});
      //3、listen后就能接受外部指令了
      //recvPort.listen((command){});//接收外部指令

      return 1;
    }
}

onTap() async{
    var recvPort = ReceivePort();
    var data = MyData(recvPort.sendPort,123);
    //监听返回消息
    recvPort.listen((message) {
      print('recvPort.listen:${message}');
      //listen里面是可以setState更新ui的
      setState(()=>_message = message);
    });
    //Isolate开启线程
   await Isolate.spawn(go,data);
   //也可以用compute
   //await Isolate.compute(go,data);
/*
    //ps:如果go是一个非静态方法,可以这样执行
    await Isolate.spawn((data){
      go(data);
    },data);
*/
    return;
}

相关文章

  • 消息通信

    为什么需要消息通信? Android的主线程即UI线程是非安全线程,只允许UI线程更新UI状态。其它任务线程处理完...

  • Handler的使用

    Handler通信工作原理 Android中为了UI操作线程安全,只允许UI线程更新Activity里的UI组件。...

  • Android线程间通信方式

    一般说线程间通信主要是指主线程(也叫UI线程)和子线程之间的通信,主要有以下两种方式: 1.AsyncTask机制...

  • android中handler message和looper的相

    1 主线程和UI线程的通信。 2 Handler可以把消息/Runnable对象发给Looper,由它把消息放入所...

  • Android线程---UI线程和非UI线程之间通信

    当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message。我的主线...

  • Python 天下第 1 !

    Cpp 天下第 0 课程设计只剩下数据库和UI了多线程部分还剩一点线程间通信

  • Handler基础运用及源码分析

    前言 众所周知,因为android平台不允许在子线程中更新ui,那么如何在子线程和主线程中通信呢?聪明的googl...

  • Handler源码解析

    1.概述 Handler一般在Android的UI线程和子线程间通信使用,之前我们在分析AsyncTask源码的时...

  • Handler原理的简单版本

    Hanlder的存在主要是为了主线(UI)线程和子线程之间的通信(即Android的消息机制),原因是androi...

  • Android Handler 笔记

    Handler 发送(延时)/接收/处理消息 1.UI线程更新 2.主/子线程通信 主要的几个类...

网友评论

      本文标题:ReceivPort,线程和ui通信

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