当前位置:网站首页>Flutter3.0线程——四步教你如何全方位了解(事件队列)
Flutter3.0线程——四步教你如何全方位了解(事件队列)
2022-08-04 01:39:00 【守住Android最后的光】
一、应用场景
- 队列压缩视频
- 队列解密视频
- 队列请求网络
- 等等
二、实现思路
- 定义一个任务队列taskList [先进先出]
- 提供添加任务方法
- 取第一个任务执行
- 执行完后,从taskList移除
- 递归获取第一个任务并执行任务
- 直到taskList为空停止队列任务
三、具体实现
class QueueUtil {
/// 用map key存储多个QueueUtil单例,目的是隔离多个类型队列任务互不干扰
/// Use map key to store multiple QueueUtil singletons, the purpose is to isolate multiple types of queue tasks without interfering with each other
static Map<String, QueueUtil> _instance = Map<String, QueueUtil>();
static QueueUtil get(String key) {
if (_instance[key] == null) {
_instance[key] = QueueUtil._();
}
return _instance[key];
}
QueueUtil._() {
/// 初始化代码
}
List<_TaskInfo> _taskList = [];
bool _isTaskRunning = false;
int _mId = 0;
bool _isCancelQueue = false;
Future<_TaskInfo> addTask(Function doSomething) {
_isCancelQueue = false;
_mId++;
_TaskInfo taskInfo = _TaskInfo(_mId, doSomething);
/// 创建future
Completer<_TaskInfo> taskCompleter = Completer<_TaskInfo>();
/// 创建当前任务stream
StreamController<_TaskInfo> streamController = new StreamController();
taskInfo.controller = streamController;
/// 添加到任务队列
_taskList.add(taskInfo);
/// 当前任务的stream添加监听
streamController.stream.listen((_TaskInfo completeTaskInfo) {
if (completeTaskInfo.id == taskInfo.id) {
taskCompleter.complete(completeTaskInfo);
streamController.close();
}
});
/// 触发任务
_doTask();
return taskCompleter.future;
}
void cancelTask() {
_taskList = [];
_isCancelQueue = true;
_mId = 0;
_isTaskRunning = false;
}
_doTask() async {
if (_isTaskRunning) return;
if (_taskList.isEmpty) return;
/// 取任务
_TaskInfo taskInfo = _taskList[0];
_isTaskRunning = true;
/// 模拟执行任务
await taskInfo.doSomething?.call();
taskInfo.controller.sink.add(taskInfo);
if (_isCancelQueue) return;
/// 出队列
_taskList.removeAt(0);
_isTaskRunning = false;
/// 递归执行任务
_doTask();
}
}
class _TaskInfo {
int id; // 任务唯一标识
Function doSomething;
StreamController<_TaskInfo> controller;
_TaskInfo(this.id, this.doSomething, {this.controller});
}
四、使用
main() {
/// 将任务添加到队列
print("加入队列-net, taskNo: 1");
QueueUtil.get("net").addTask(() {
return _doFuture("net", 1);
});
print("加入队列-net, taskNo: 2");
QueueUtil.get("net").addTask(() {
return _doFuture("net", 2);
});
print("加入队列-local, taskNo: 1");
QueueUtil.get("local").addTask(() {
return _doFuture("local", 1);
});
/// 取消队列任务
/// QueueUtil.get("net").cancelTask();
}
Future _doFuture(String queueName, int taskNo) {
return Future.delayed(Duration(seconds: 2), () {
print("任务完成 queueName: $queueName, taskNo: $taskNo");
});
}
// 执行结果:
I/flutter (26436): 加入队列-net, taskNo: 1
I/flutter (26436): 加入队列-net, taskNo: 2
I/flutter (26436): 加入队列-local, taskNo: 1
------------两秒后--------
I/flutter (26436): 任务完成 queueName: net, taskNo: 1
I/flutter (26436): 任务完成 queueName: local, taskNo: 1
------------两秒后--------
I/flutter (26436): 任务完成 queueName: net, taskNo: 2
上述就是flutter的线程中的;事件队列。我们从应用场景、实现思路、具体实现、到使用、四个方面了解并使用。flutter 知识学习除了文章中flutter线程事件队列一小部分还分别区分了这几大块:Dart语法基础+语法进阶+flutter UI+flutter线程+flutter启动流程+flutter之framework框架+flutter监控学习。
如果你正好在学习flutter,或者准备学习flutter。在学习中遇到不知道该怎么学习。或者不知从哪开始;可以看我总结如下图的学习指南图:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhzYQWwb-1659536709732)(https://upload-images.jianshu.io/upload_images/28055132-6770185fa5013cf1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]](/img/fd/6de71b9b74203ce3da88271a78c372.png)
针对flutter,总结出的核心技术学习方法。整理出一套相对应的资料配合学习。
可以看出图中学习思路很清晰,配合资料学习起来比网上杂乱的资料,学习来事半功倍;如有急切想进阶自己技术,跳槽找工作的。可以上面获取,免费,还望多给博主一些点赞+关注;可以多评论互动哟!
边栏推荐
- 一个注解替换synchronized关键字:分布式场景下实现方法加锁
- 【虚拟户生态平台】虚拟化平台安装时遇到的坑
- 2022年上半年各大厂Android面试题整理及答案解析(持续更新中......)
- html select标签赋值数据库查询结果
- Continuing to invest in product research and development, Dingdong Maicai wins in supply chain investment
- 持续投入商品研发,叮咚买菜赢在了供应链投入上
- typescript55 - generic constraints
- C 学生管理系统_添加学生
- Array_Sliding window | leecode brushing notes
- 计算首屏时间
猜你喜欢

静态/动态代理模式

实例041:类的方法与变量

flask框架初学-06-对数据库的增删改查

MySQL回表指的是什么

实例039:有序列表插入元素

Continuing to invest in product research and development, Dingdong Maicai wins in supply chain investment

Electronics manufacturing enterprise deployment WMS what are the benefits of warehouse management system

esp32发布机器人电池电压到ros2(micro-ros+CoCube)

持续投入商品研发,叮咚买菜赢在了供应链投入上

nodejs安装及环境配置
随机推荐
持续投入商品研发,叮咚买菜赢在了供应链投入上
nodejs+express realizes the access to the database mysql and displays the data on the page
114. How to find the cause of Fiori Launchpad routing error by single-step debugging
C语言:学生管理系统(链表版)
ThreadLocal
【store商城项目01】环境准备以及测试
Installation and configuration of nodejs+npm
一个项目的整体测试流程有哪几个阶段?测试方法有哪些?
多渠道打包
简单的线性表的顺序表示实现,以及线性表的链式表示和实现、带头节点的单向链表,C语言简单实现一些基本功能
Demand analysis of MES management system in electronic assembly industry
Download install and create/run project for HBuilderX
一篇文章看懂JS闭包,从执行上下文角度解析有趣的闭包
持续投入商品研发,叮咚买菜赢在了供应链投入上
thinkphp 常用技巧
KunlunBase 1.0 is released!
Multithreading JUC Learning Chapter 1 Steps to Create Multithreading
Promise solves blocking synchronization and turns asynchronous into synchronous
计算首屏时间
Flink jdbc connector 源码改造sink之 clickhouse多节点轮询写与性能分析