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 _instance = Map(); 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: 1I/flutter (26436): 加入队列-net, taskNo: 2I/flutter (26436): 加入队列-local, taskNo: 1------------两秒后--------I/flutter (26436): 任务完成 queueName: net, taskNo: 1I/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,总结出的核心技术学习方法。整理出一套相对应的资料配合学习。
可以看出图中学习思路很清晰,配合资料学习起来比网上杂乱的资料,学习来事半功倍;如有急切想进阶自己技术,跳槽找工作的。可以私信发送:“手册”获取资料一份《Flutter3.0手册》,资料免费,还望多给博主一些点赞+关注;可以多评论互动哟!
| 留言与评论(共有 0 条评论) “” |