当前位置:网站首页>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,总结出的核心技术学习方法。整理出一套相对应的资料配合学习。
可以看出图中学习思路很清晰,配合资料学习起来比网上杂乱的资料,学习来事半功倍;如有急切想进阶自己技术,跳槽找工作的。可以上面获取,免费,还望多给博主一些点赞+关注;可以多评论互动哟!
边栏推荐
猜你喜欢

优秀的测试/开发程序员,是怎样修炼的?步步为营地去执行......

Observability:你所需要知道的关于 Syslog 的一些知识

- heavy OpenCV 】 【 mapping

即席查询——Presto

typescript58 - generic classes

nodejs+express realizes the access to the database mysql and displays the data on the page

LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization

MongoDB数据接入实践

DDTL:远距离的域迁移学习

特征值与特征向量
随机推荐
splice随机添加和删除的写法
C 学生管理系统_分析
【Untitled】
Sticker Spelling - Memory Search / Shape Pressure DP
nodejs 安装多版本 版本切换
C 学生管理系统_添加学生
静态/动态代理模式
How to find the cause of Fiori Launchpad routing errors by single-step debugging
nodejs installation and environment configuration
有没有jdbc 链接优炫数据库文档及示例?
持续投入商品研发,叮咚买菜赢在了供应链投入上
HBuilderX的下载安装和创建/运行项目
Continuing to invest in product research and development, Dingdong Maicai wins in supply chain investment
2022年上半年各大厂Android面试题整理及答案解析(持续更新中......)
工程制图复习题
nodejs+express realizes the access to the database mysql and displays the data on the page
Variable string
多渠道打包
The 600MHz band is here, will it be the new golden band?
《The Google File System》新说