当前位置:网站首页>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。在学习中遇到不知道该怎么学习。或者不知从哪开始;可以看我总结如下图的学习指南图:
针对flutter,总结出的核心技术学习方法。整理出一套相对应的资料配合学习。
可以看出图中学习思路很清晰,配合资料学习起来比网上杂乱的资料,学习来事半功倍;如有急切想进阶自己技术,跳槽找工作的。可以上面获取,免费,还望多给博主一些点赞+关注;可以多评论互动哟!
边栏推荐
- 持续投入商品研发,叮咚买菜赢在了供应链投入上
- jmeter distributed stress test
- Sky map coordinate system to Gaode coordinate system WGS84 to GCJ02
- nodejs+express realizes the access to the database mysql and displays the data on the page
- Demand analysis of MES management system in electronic assembly industry
- redis中常见的问题(缓存穿透,缓存雪崩,缓存击穿,redis淘汰策略)
- What warehouse management problems can WMS warehouse management system solve in the electronics industry?
- Electronics manufacturing enterprise deployment WMS what are the benefits of warehouse management system
- Google Earth Engine - Calculates the effective width of rivers using publicly available river data
- initramfs详解----添加硬盘驱动并访问磁盘
猜你喜欢
字符串变形
SAP SD模块前台操作
持续投入商品研发,叮咚买菜赢在了供应链投入上
Download install and create/run project for HBuilderX
工程制图平面投影练习
5. Scrapy middleware & distributed crawler
Vant3 - click on the corresponding name name to jump to the next page corresponding to the location of the name of the TAB bar
JS 保姆级贴心,从零教你手写实现一个防抖debounce方法
实例041:类的方法与变量
ASP.NET 获取数据库的数据并写入到excel表格中
随机推荐
Continuing to invest in product research and development, Dingdong Maicai wins in supply chain investment
实例038:矩阵对角线之和
Observability:你所需要知道的关于 Syslog 的一些知识
字符串变形
typescript58 - generic classes
thinkphp 常用技巧
Slipper —— 虚点,最短路
Is there any jdbc link to Youxuan database documentation and examples?
天地图坐标系转高德坐标系 WGS84转GCJ02
【虚拟化生态平台】虚拟化平台esxi挂载USB硬盘
TensoFlow学习记录(二):基础操作
持续投入商品研发,叮咚买菜赢在了供应链投入上
工程制图复习题(带答案)
可变字符串
C 学生管理系统 显示链表信息、删除链表
Intranet penetration - application
数组_滑动窗口 | leecode刷题笔记
HBuilderX的下载安装和创建/运行项目
LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
实例039:有序列表插入元素