返回顶部
首页 > 资讯 > 精选 >Flutter队列任务如何实现
  • 361
分享到

Flutter队列任务如何实现

2023-07-02 09:07:19 361人浏览 安东尼
摘要

本篇内容介绍了“Flutter队列任务如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!队列任务队列,那当然要有个队列。这个队列的任务内

本篇内容介绍了“Flutter队列任务如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    队列

    任务队列,那当然要有个队列。这个队列的任务内容应该是返回FutureFunction,因为我需要得到他处理完成的结果,比如等待弹窗关闭时return,才表示这个任务被完成。

    typedef TaskEventFunction = Future Function();class TaskQueue {    List<TaskEventFunction> _actionQueue = [];}

    添加任务进队列

    然后是加入队列的方法add

    void add(TaskEventFunction task) {  _actionQueue.add(task);}

    然后想到,队列是不是最好去重?或者可选去重。

    那一个Function如何去重呢,我们可以使用它的hashCode,同一个FunctionhashCode相同

    taskQueue.add(testFunction);Future testFunction() async {  await Future.delayed(const Duration(milliseconds: 1000));  return Future.value(true);}

    即我们可以按上面这样定义,同一个类同一个实例下同一个Function,就是相同的hashCode。若是以下这种写法则hashCode不一样,每次add都相当于一个新的Function

    taskQueue.add(() async {  await Future.delayed(const Duration(milliseconds: 1000));  return Future.value(true);});

    假如不需要去重,可以用第二种。也可以主动指定taskId来选择哪些需要去重(即使内容不一样),哪些不需要。

    修改一下add,增加taskId。同时hashCode应该作为主要的key,修改一下队列类型。 最终如下:

    /// 任务编号队列List<String> _actionQueue = [];/// 任务队列Map<String, TaskEventFunction> _actionMap = {};/// 指定taskId 为 -1 则不用去重String add(TaskEventFunction task, {  String? taskId,}) {  String? id = taskId;  id ??= task.hashCode.toString();  bool isContains = false;  if (taskId != '-1') {    isContains = _actionQueue.contains(id);  } else {    id = task.hashCode.toString();  }  if (!isContains) {    _actionQueue.add(id);    _actionMap[id] = task;  }  return id;}

    -1时则不去重,也把最终的taskId返回。

    移除队列指定任务

    有添加任务的方法,那也需有移除任务的方法

    /// 这里需注意,add的时taskId为-1,那就直接把task传入,add时有返回,可以对应bool remove(TaskEventFunction task, {String? taskId}) {  String? id = taskId;  id ??= task.hashCode.toString();  if (_actionQueue.contains(id)) {    _actionMap.remove(id);    return _actionQueue.remove(id);  }  return false;}

    taskId/hashCode为准。

    判断是否包含对应任务

    使用者可以自己判断是否已包含对应的任务

    /// 是否队列中包含该任务/// [task] 与 [taskId] 应该只传一个bool containers({TaskEventFunction? task, String? taskId}) {  assert(task != null || taskId != null);  String? id = taskId;  id ??= task.hashCode.toString();  return _actionQueue.contains(taskId);}

    执行队列任务

    任务队列的进出基本成型,开始处理任务。很简单,取出任务,然后执行任务,最后移除任务

    void startLoop() async {  if (dealing || _actionQueue.isEmpty) {    return;  }  dealing = true;  String taskId = _actionQueue.first;  TaskEventFunction? callback = _actionMap[taskId];  if (callback == null) {    _actionQueue.remove(taskId);    return;  }  try {    await callback();  } catch (e) {    log('_actionQueue 出错 $e');  } finally {    _actionQueue.remove(taskId);    _actionMap.remove(taskId);    dealing = false;    if (_actionQueue.isNotEmpty) {      startLoop();    }  }}

    这里加了个dealing,表示任务正在处理中的状态,正在处理的话,不允许执行下一个任务。

    在执行完成(或失败)后,自动触发下一个任务。add中也可以加入startLoop,使添加任务后自动启动任务循环。

    任务条件

    基本的任务队列已经完成。不过每个任务其实一般都会有个条件,确认符合当前场景才执行。比如说的确是新人且在首页,才显示新人优惠弹窗。

    条件可以是整个任务队列统一的条件,也可以是某个任务特定的条件

    typedef TaskConditionFunction = FutureOr<bool> Function();

    这里类型用FutureOr<bool>,有可能需要等待一下才能确认条件。任务对应的条件,也根据taskId来存储。

    /// 任务条件Map<String, TaskConditionFunction> _actionCondition = {};/// 总条件TaskConditionFunction? _condition;

    添加任务时加入条件

    TaskEventFunction add(TaskEventFunction task, {  String? taskId,  TaskConditionFunction? condition,}) {    ...        if (condition != null && !_actionCondition.containsKey(id)) {      _actionCondition[id] = condition;    }}

    设置总条件,或补充条件

    /// 设置允许执行条件void setAcceptConditions(TaskConditionFunction condition,    {String? taskId}) {  if (taskId == null) {    _condition = condition;  } else {    _actionCondition[taskId] = condition;  }}

    执行任务前判断条件是否满足

        bool canNext = await _nextConditions(taskId);    if (canNext) {      try {        await callback();      } catch (e) {        log('_actionQueue 出错 $e');      } finally {        _actionQueue.remove(taskId);        _actionMap.remove(taskId);        dealing = false;        if (_actionQueue.isNotEmpty) {          startLoop();        }      }    } else {      // 不满足条件一般后续的也不会执行      dealing = false;    }
    Future<bool> _nextConditions([String? id]) async {  String taskId = id ?? _actionQueue.first;  bool canNext = true;  var taskCondition = _actionCondition[taskId];  if (_condition != null) {    canNext = await _condition!.call();  }  if (canNext && taskCondition != null) {    canNext = await taskCondition();  }  return Future.value(canNext);}

    原则上应该既满足总条件也满足任务条件

    使用和总结

    实例化TaskQueue

    TaskQueue taskQueue = TaskQueue();

    添加任务并开始任务

    taskQueue.add(testFunction, condition: () async {  await Future.delayed(const Duration(milliseconds: 200));  return Future.value(true);});taskQueue.startLoop();Future testFunction() async {  return showDialog(...);}

    注意设置条件要返回bool

    还可以加入类似延时等操作,跟条件一样配置即可。太久的操作不要像上面一样写在condition中,可能执行完之后又不满足了,根据具体情况考虑。

    一般来说类似弹窗的returnawait showDialog就可以等待弹窗页面结束,再进行下一个。

    跨页面还是当前页面的控制,只需要考虑是全局实例TaskQueue还是页面内实例TaskQueue

    “Flutter队列任务如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Flutter队列任务如何实现

    本文链接: https://lsjlt.com/news/340860.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Flutter队列任务如何实现
      本篇内容介绍了“Flutter队列任务如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!队列任务队列,那当然要有个队列。这个队列的任务内...
      99+
      2023-07-02
    • Flutter 队列任务的实现
      目录前言队列添加任务进队列移除队列指定任务判断是否包含对应任务执行队列任务任务条件添加任务时加入条件执行任务前判断条件是否满足使用和总结前言 在电商的应用中,最常见的就是在首页或完成...
      99+
      2024-04-02
    • 如何在Redis中实现延迟任务队列
      在Redis中实现延迟任务队列可以使用有序集合(Sorted Set)和定时任务的方式来实现。以下是一个基本的实现方法: 将任务存...
      99+
      2024-04-09
      Redis
    • 如何用Go语言和Redis实现任务队列
      如何用Go语言和Redis实现任务队列引言:在实际的软件开发中,经常会遇到需要处理大量任务的场景。为了提高处理效率和可靠性,我们可以使用任务队列来分发和执行这些任务。本文将介绍如何使用Go语言和Redis实现一个简单的任务队列,以及具体的代...
      99+
      2023-10-26
      Go语言 redis 任务队列
    • 如何利用Redis实现分布式任务队列
      如何利用Redis实现分布式任务队列引言:随着互联网应用的快速发展,分布式系统成为了企业追求高性能和高可扩展性的重要选择。而在分布式系统中,任务队列被广泛应用于各种场景,例如消息发布、数据同步、任务调度等。Redis作为一款快速的内存数据库...
      99+
      2023-11-07
      分布式 redis 任务队列
    • Node.js + Redis Sorted Set实现任务队列
      需求:功能 A 需要调用第三方 API 获取数据,而第三方 API 自身是异步处理方式,在调用后会返回数据与状态 { data: "查询结果", "status": "正在异步处理中" } ,这样就需要间隔...
      99+
      2022-06-04
      队列 js Node
    • JS怎么实现异步任务队列
      本篇内容主要讲解“JS怎么实现异步任务队列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JS怎么实现异步任务队列”吧!问题有个需求,需要实现一个异步任务队列,并...
      99+
      2024-04-02
    • golang异步任务队列怎么实现
      在Go语言中,可以使用goroutine和channel来实现异步任务队列。下面是一个简单的示例代码: package main ...
      99+
      2023-10-27
      golang
    • Python实现简单多线程任务队列
      最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码): def gradient_descent(): # the gradient descent...
      99+
      2022-06-04
      队列 多线程 简单
    • Java实现FIFO任务调度队列策略
      目录前言FIFO任务调度器架构示例代码前言 在工作中,很多高并发的场景中,我们会用到队列来实现大量的任务请求。当任务需要某些特殊资源的时候,我们还需要合理的分配资源,让队列中的任务高...
      99+
      2024-04-02
    • Laravel怎么实现队列和任务调度
      本文小编为大家详细介绍“Laravel怎么实现队列和任务调度”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel怎么实现队列和任务调度”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、 我们首先准备一下...
      99+
      2023-07-04
    • Java中如何实现消息队列任务的平滑关闭
      这篇文章主要介绍Java中如何实现消息队列任务的平滑关闭,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩...
      99+
      2023-05-30
      java
    • golang如何实现队列
      golang可以使用标准库中的”container/list“包实现队列:1、使用import关键字导入包;2、定义函数”main“;3、通过”list.New()“函数创建了一个新的队列q;4、使用”PushBack()“方法向队列中添加...
      99+
      2023-12-12
      Golang golang实现队列
    • vue中的任务队列和异步更新策略(任务队列,微任务,宏任务)
      目录事件循环任务队列如何理解微任务和宏任务深究Vue异步更新策略原理事件循环 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 为了协调事件、用户交...
      99+
      2022-11-13
      vue异步更新 vue任务队列 vue微任务 vue宏任务
    • 如何在PHP开发中实现异步任务和消息队列?
      如何在PHP开发中实现异步任务和消息队列?随着互联网的高速发展,网站的访问量和数据处理量越来越大。为了提高用户体验和系统的稳定性,开发人员不得不考虑如何高效地处理大量的并发请求和耗时任务。异步任务和消息队列成为了解决这个问题的有效手段。异步...
      99+
      2023-11-03
      PHP编程 消息队列 异步任务
    • RabbitMQ消息队列实现延迟任务示例
      目录一、序言1、实现原理2、组件选型二、方案设计(一)服务器(二)生产者(三)消费者三、SpringBoot实现(一)生产者(二)消费者(三)通用工具包一、序言 延迟任务应用广泛,延...
      99+
      2024-04-02
    • laravel6中怎么实现队列与任务调度
      本篇文章为大家展示了laravel6中怎么实现队列与任务调度,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(一)队列实现在laravel中,队列的实现我们只需要通过操作,就能实现,在实现的前提,我们...
      99+
      2023-06-20
    • RabbitMQ消息队列怎么实现延迟任务
      这篇文章主要介绍“RabbitMQ消息队列怎么实现延迟任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RabbitMQ消息队列怎么实现延迟任务”文章能帮助大家解决问题。一、序言延迟任务应用广泛,延...
      99+
      2023-06-29
    • js中如何实现队列
      这篇文章主要介绍了js中如何实现队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。队列定义队列(Queue)是一种遵从先进先出(First ...
      99+
      2024-04-02
    • 如何利用Redis和Rust语言实现异步任务队列功能
      如何利用Redis和Rust语言实现异步任务队列功能引言:在当今高并发的互联网应用中,异步任务队列是非常常见和实用的功能。它可以将耗时较长的任务从主线程异步处理,提高系统的吞吐能力和响应速度。本文将介绍如何利用Redis和Rust语言实现一...
      99+
      2023-10-22
      Rust redis 异步任务队列
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作