Flutter:多线程Isolate的简单使用
在flutter中如果要使用线程,需要借助Isolate来实现。
简介
在Flutter中,Isolate是一种轻量级的线程解决方案,用于在应用程序中执行并发任务。Isolate可以被认为是独立于主线程的工作单元,它们可以在后台执行任务而不会阻塞应用程序的用户界面。
Isolate提供了多线程编程的能力,允许开发者在应用程序中同时执行多个任务,从而提高应用程序的性能和响应能力。每个Isolate都有自己独立的内存空间和执行环境,它们之间可以通过消息传递进行通信。
在Flutter中,可以使用dart:isolate库来创建和管理Isolate。通过创建一个Isolate对象,可以指定要执行的任务代码。Isolate可以执行耗时的计算、网络请求、文件操作等任务,而不会阻塞应用程序的主线程。
与其他线程解决方案相比,Isolate的一个重要特点是它们之间的内存是隔离的,这意味着每个Isolate都有自己独立的内存空间,它们之间不能直接共享数据。为了在Isolate之间传递数据,可以使用消息传递机制,即将数据打包成消息发送给目标Isolate,并在接收端解包处理。
使用Isolate可以提高应用程序的性能和响应能力,特别是在处理大量计算密集型任务或需要与外部资源进行交互的场景中。然而,需要注意的是,Isolate的创建和销毁都会带来一定的开销,因此在使用Isolate时需要权衡资源消耗和性能提升之间的平衡。
总而言之,Isolate是Flutter中的一种轻量级线程解决方案,用于在应用程序中执行并发任务。它们可以独立于主线程执行任务,并通过消息传递机制进行通信。使用Isolate可以提高应用程序的性能和响应能力,特别是在处理计算密集型任务或需要与外部资源进行交互的场景中。
匿名函数使用
void _incrementCounter() {setState(() {_counter++;});// 匿名线程Isolate.spawn((message) {print("匿名函数线程:$message");}, '哈哈哈');
}
参数会被传递到匿名函数中,并被匿名函数所使用。
普通函数
void _incrementCounter() {setState(() {_counter++;});// 普通线程Isolate.spawn(newThread1, "普通线程");}
// 创建一个额外线程
void newThread1(String message){print(message);
}
这个一定要注意,在flutter中使用时newThread1不能写在主进程所在的类里。否则会提示[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Invalid argument(s): Illegal argument in isolate message: object is unsendable - Library:'dart:async' Class: _AsyncCompleter@4048458 (see restrictions listed at SendPort.send() documentation for more information)
子线程向主线程通信
// 创建一个额外线程
void newThread1(SendPort mainThreadPort) {int num = 0;Timer.periodic(const Duration(seconds: 1), (timer) {// 每隔1秒num加1num += 1;mainThreadPort.send(num);if (num == 10) {// 向主进程发消息执行完成mainThreadPort.send('stop');}});
}class _MyHomePageState extends State<MyHomePage> {final receivePort = ReceivePort();void _incrementCounter() async {// 子线程final isolate = await Isolate.spawn(newThread1, receivePort.sendPort);// 监听子线程发送的消息receivePort.listen((message) {print("子线程发送的消息:$message");if (message == 'stop') {// 执行完成则停止显示print("线程执行完成");isolate.kill(priority: Isolate.immediate);}});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title),),body: const Center(child: Text("多线程")),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: const Icon(Icons.add),), // This trailing comma makes auto-formatting nicer for build methods.);}
}

主线程向子线程通信
在子线程执行期间,主线程也可以向子线程进行通信。基于上面的代码,进行简单修改
void newThread1(SendPort mainThreadPort) {int num = 0;ReceivePort receivePort = ReceivePort();Timer.periodic(const Duration(seconds: 1), (timer) {// 每隔1秒num加1num += 1;mainThreadPort.send(num);if(num==1){// 跟主进程类似,将receivePort.sendPort传递给主进程,主进程才能向子进程通信mainThreadPort.send(receivePort.sendPort);}if (num == 10) {// 向主进程发消息执行完成mainThreadPort.send('stop');}});// 接收主进程发送的消息receivePort.listen((message) {print("收到了主进程的消息:$message");});
}
void _incrementCounter() async {// 子线程final isolate = await Isolate.spawn(newThread1, receivePort.sendPort);late SendPort childSendPort;// 监听子线程发送的消息receivePort.listen((message) {print("子线程发送的消息:$message");if (message is SendPort) {childSendPort = message;}if (message == 6) {childSendPort.send("加油,马上完成了");}if (message == 'stop') {// 执行完成则停止显示print("线程执行完成");isolate.kill(priority: Isolate.immediate);}});}
怎么理解呢?
子线程要想向主线程通信,需要获取到主线程的receivePort.sendPort,因此在子线程已创建,就以参数的形式将主线程的receivePort.sendPort传递给子线程。
同理,主线程要想向子线程通信也需要拿到子线程的receivePort.sendPort,因此在子线程一开始执行就将自己的receivePort.sendPort发送给主线程。
只有主线程、子线程都拿到对方的receivePort.sendPort 才可以进行互相通信。

相关文章:
Flutter:多线程Isolate的简单使用
在flutter中如果要使用线程,需要借助Isolate来实现。 简介 在Flutter中,Isolate是一种轻量级的线程解决方案,用于在应用程序中执行并发任务。Isolate可以被认为是独立于主线程的工作单元,它们可以在后台执行任务而不会阻塞应用程…...
SAP的一些当说不说的常识
ABAP中的WDA与FRMbopf restful和odata postman软件 SAP中MM模块相关 SAP 物料 移动类型 https://www.cnblogs.com/rainysblog/p/4133259.html T移动类型文本含义一般用途T-code101GR 收货直接收货工单入库,购买成品入库MIGO/CO11N102用于PO冲销的收货冲销直接…...
Java运行时数据区和常用指令
Java运行时数据区是Java虚拟机规范中定义的一块区域,用于存储Java程序在运行过程中需要使用到的数据。这些数据包括: 1. 堆区:用于存储对象实例,是Java内存中最大的一块区域。2. 方法区:用于存储已被虚拟机加载的类信…...
hdfsClient_java对hdfs进行上传、下载、删除、移动、打印文件信息尚硅谷大海哥
Java可以通过Hadoop提供的HDFS Java API来控制HDFS。通过HDFS Java API,可以实现对HDFS的文件操作,包括文件的创建、读取、写入、删除等操作。 具体来说,Java可以通过HDFS Java API来创建一个HDFS文件系统对象,然后使用该对象来进…...
【前端学java】语法练习-工具类的封装(13)
往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…...
Git 基本操作
目录 创建仓库命令 git init git clone 提交与修改 git add git status git diff git commit git reset git rm git mv git checkout git switch git restore 提交日志 git log git blame 远程操作 git remote git fetch git pull git push Git 的工作就…...
Oracle-分析函数(累计求和,排序等)
在Oracle中分析函数又称为开窗函数 分为以下两类: 第一类:是聚合分析函数,主要包含(sum,count,AVG、MAX、MIN等),主要是对内部分组的数值按照要求内部聚合处理; 第二类&a…...
4本期刊被踢!11月SCI/SSCI目录已更新
2023年11月20日,科睿唯安更新了Web of Science核心期刊目录。 此次更新后SCIE期刊目录共包含9481本期刊,SSCI期刊目录共包含3551本期刊。此次SCIE & SSCI期刊目录更新,与上次更新(2023年10月)相比,共…...
JS中Cookie的基本使用
JavaScript 创建Cookie: JavaScript 读取 Cookie : JavaScript 修改 Cookie: JavaScript 删除 Cookie : JavaScript Cookie(JavaScript 的 Cookie)是一种在Web浏览器中存储和检索用户信息的机制。它允许…...
关闭windows防火墙命令
关闭windows防火墙命令 打开windows PowerShell (管理员) 或 CMD (管理员) 指令: 查看当前防火墙状态:netsh advfirewall show allprofiles 关闭防火墙:netsh advfirewall set allprofiles state off 开启防火墙:netsh advfirewa…...
excel-gen.js 导出excel 功能
目录 概要 整体架构流程 html部分: js部分: json部分: 小结 概要 功能会使用到如下插件: jszip.min.js FileSaver.js jquery.min.js excel-gen.js highcharts.js exporting.js export_data.js 主要是highcharts图表…...
键鼠自动化2.0展示
软件介绍:桌面键鼠自动化工具 Qtc 编写: 本软件采用Qt C编写,旨在提供高效、跨平台的桌面键鼠自动化解决方案。Qt C框架的选择确保了软件的稳定性、可靠性,并通过其图形用户界面实现了用户友好的操作体验。 鼠标移动与点击&#…...
html主页框架,前端首页通用架构,layui主页架构框架,首页框架模板
html主页框架 前言功能说明效果使用初始化配置菜单加载主题修改回调 其他非iframe页面内容使用方式iframe页面内容使用方式 前言 这是一个基于layui、jquery实现的html主页架构 平时写的系统后台可以直接套用此框架 由本人整合编写实现,简单上手,完全免…...
SDWAN厂家排名
随着网络技术的不断发展,SDWAN(软件定义广域网)作为一种新兴的网络架构,正在受到越来 越多企业的关注和采用。选择一家可靠的SDWAN厂家成为企业成功部署和管理SDWAN的关键。本文将从技术实力、客户口碑以及市场占有率三个方面&…...
【STM32】CRC(循环冗余校验)
一、CRC的背景知识 1、什么是CRC (1)CRC(Cyclic Redundancy Check),循环冗余校验 (2)什么是校验,为什么需要校验:数据传输,数据存储过程中需要使用到的 (3)什么是冗余:表示比实际上要传输的数据…...
04.webpack中css的压缩和抽离
1.抽离css文件 利用mini-css-extract-plugin插件,替代style-loader const MiniCssExtractPlugin require(mini-css-extract-plugin) module.exports smart(webpackCommonConf, {mode: production,output: {// filename: bundle.[contentHash:8].js, // 打包代码…...
Vue 3 和 Spring Boot 3 的操作流程和执行步骤详解
1.介绍 在本篇博客中,我们将详细介绍Vue 3 和 Spring Boot 3 的操作流程和执行步骤。Vue 3 是一款流行的前端框架,而Spring Boot 3 是一款广泛应用于后端开发的框架。通过结合使用这两个框架,我们可以构建出功能强大的全栈应用。 2.Vue 3 的操…...
获取所有非manager的员工emp_no
个人网站 文章首发于公众号小肖学数据分析 题目来自牛客网 描述 有一个员工表employees简况如下: emp_nobirth_datefirst_namelast_namegenderhire_date100011953-09-02GeorgiFacelloM1986-06-26100021964-06-02BezalelSimmelF1985-11-21100031959-12-03PartoBamfordM1986…...
STM32存储左右互搏 SPI总线FATS文件读写FLASH W25QXX
STM32存储左右互搏 SPI总线FATS文件读写FLASH W25QXX FLASH是常用的一种非易失存储单元,W25QXX系列Flash有不同容量的型号,如W25Q64的容量为64Mbit,也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库实现FATS文件操作W25Q各型号FLASH的例程。…...
Sentinel 熔断规则 (DegradeRule)
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…...
多机器人协作运输系统的强化学习实现与优化
1. 项目概述在仓储物流、建筑施工等工业场景中,多机器人协作运输系统正展现出巨大的应用潜力。想象一下,当需要搬运超长钢管或重型设备时,传统单机器人系统往往力不从心。而由多个四足机器人组成的协作系统,就像一支训练有素的搬运…...
彻底清理Windows右键菜单:ContextMenuManager可视化管理指南
彻底清理Windows右键菜单:ContextMenuManager可视化管理指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单的臃肿而烦恼…...
CANN OpenVLA昇腾推理指南
OpenVLA on 310P具身智能VLA大模型昇腾使用指南 【免费下载链接】cann-recipes-embodied-intelligence 本项目针对具身智能业务中的典型模型、加速算法,提供基于CANN平台的优化样例 项目地址: https://gitcode.com/cann/cann-recipes-embodied-intelligence …...
拓扑量子计算的可扩展性挑战与Matryoshka链解决方案
1. 拓扑量子计算的可扩展性挑战 量子计算的可扩展性一直是该领域最核心的挑战之一。随着量子比特数量的增加,系统面临的退相干、噪声干扰和操控复杂度等问题呈指数级增长。传统量子计算架构通常需要为每个量子比特提供独立的物理隔离和操控系统,这在扩展…...
音频工程中的平衡与非平衡连接技术解析
1. 平衡与非平衡音频基础解析在专业音频工程领域,平衡与非平衡连接是两种最基础的信号传输方式。从业20年来,我见证过无数因接口选择不当导致的系统故障——从细微的底噪到灾难性的交流声干扰。理解它们的本质区别,是搭建可靠音频系统的第一步…...
CANN/hixl A3芯片性能数据
HIXL在昇腾A3芯片上部分场景实测性能数据 【免费下载链接】hixl HIXL(Huawei Xfer Library)是一个灵活、高效的昇腾单边通信库,面向集群场景提供简单、可靠、高效的点对点数据传输能力。 项目地址: https://gitcode.com/cann/hixl HIX…...
3个步骤搞定SD-WebUI-Inpaint-Anything自定义修复模型:告别“找不到模型“的烦恼
3个步骤搞定SD-WebUI-Inpaint-Anything自定义修复模型:告别"找不到模型"的烦恼 【免费下载链接】sd-webui-inpaint-anything Inpaint Anything extension performs stable diffusion inpainting on a browser UI using masks from Segment Anything. 项…...
cann/sip AsumOperation示例
信号处理加速库AsumOperation C Demo 【免费下载链接】sip 本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。 项目地址: https://gitcode.com/cann/sip 介绍 该目录下为信号处理…...
AI如何优化卫星与HAPS网络的资源管理与智能切换
1. 项目概述:当AI遇见天空网络最近几年,我一直在关注一个特别有意思的交叉领域:如何把那些听起来很“酷”的人工智能技术,实实在在地用在解决天空中的通信难题上。这个项目标题——“AI在卫星通信与HAPS网络中的资源管理与切换优化…...
探索Taotoken官方价折扣活动如何帮助小型工作室降低AI应用开发门槛
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 探索Taotoken官方价折扣活动如何帮助小型工作室降低AI应用开发门槛 对于小型工作室和学生开发者而言,将大模型能力集成…...
