当前位置:网站首页>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,总结出的核心技术学习方法。整理出一套相对应的资料配合学习。
可以看出图中学习思路很清晰,配合资料学习起来比网上杂乱的资料,学习来事半功倍;如有急切想进阶自己技术,跳槽找工作的。可以上面获取,免费,还望多给博主一些点赞+关注;可以多评论互动哟!
边栏推荐
- Observability:你所需要知道的关于 Syslog 的一些知识
- What warehouse management problems can WMS warehouse management system solve in the electronics industry?
- 持续投入商品研发,叮咚买菜赢在了供应链投入上
- Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
- 螺旋矩阵_数组 | leecode刷题笔记
- boot issue
- Apache DolphinScheduler新一代分布式工作流任务调度平台实战-中
- appium软件自动化测试框架
- 在Activity中获取另一个XML文件的控件
- Analysis of usage scenarios of mutex, read-write lock, spin lock, and atomic operation instructions xaddl and cmpxchg
猜你喜欢
- heavy OpenCV 】 【 mapping
字符串的排列
什么是SVN(Subversion)?
Parquet encoding
Flink jdbc connector 源码改造sink之 clickhouse多节点轮询写与性能分析
How to find the cause of Fiori Launchpad routing errors by single-step debugging
nodejs+express realizes the access to the database mysql and displays the data on the page
typescript55 - generic constraints
字符串变形
nodejs installation and environment configuration
随机推荐
持续投入商品研发,叮咚买菜赢在了供应链投入上
Flask框架初学-05-命令管理Manager及数据库的使用
SAP SD模块前台操作
.NET Static Code Weaving - Rougamo Release 1.1.0
优秀的测试/开发程序员,是怎样修炼的?步步为营地去执行......
实例035:设置输出颜色
Sky map coordinate system to Gaode coordinate system WGS84 to GCJ02
观察者模式
Intranet penetration - application
Continuing to invest in product research and development, Dingdong Maicai wins in supply chain investment
LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
typescript55 - generic constraints
KunlunBase 1.0 发布了!
无代码7月热讯 | 微软首推数字联络中心平台;全球黑客马拉松...
内网穿透-应用
Hey, I had another fight with HR in the small group!
螺旋矩阵_数组 | leecode刷题笔记
vxe-table 从页面批量删除数据 (不动数据库里的数据)
redis中常见的问题(缓存穿透,缓存雪崩,缓存击穿,redis淘汰策略)
【日志框架】