Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。

这篇具有很好参考价值的文章主要介绍了Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.场景

我们在调用接口时,很多时候会同时调用多个接口,接口都是异步执行,我们很难知道调用的多个接口哪个会最后执行完成,我们有时候需要对最后一个接口执行完成的时机监听,所以基于该需求,设计了CombineExecutor,对类似的需求进行监听。

2.代码

group_key.dart

///合并执行分类
class GroupKey {
  ///是否需要监听,不需要监听,则不会执行监听回调
  final bool isMonitor;

  GroupKey({this.isMonitor = true});
}

executor.dart

import 'group_key.dart';

///执行者
///开始一个无限循环的执行进程,等待事件默认50毫秒
class Executor {
  final GroupKey key;

  ///延迟时间。
  ///进程执行的快慢,单位毫秒ms,时间越短,反应越灵敏,
  ///但是消耗的新能越多,不能设置为0,否则会卡住进程。
  ///默认延迟50ms。
  final int? delayed;
  bool _stop = true;
  Function(GroupKey key)? _stopCallback;
  Function(GroupKey key)? _startCallback;

  Executor(this.key, {this.delayed});

  ///开始执行[Executor]
  ///[callback]会循环调用
  start({Function(GroupKey key)? callback}) async {
    _stop = false;
    _startCallback = callback ?? _startCallback;
    while (!_stop) {
      _startCallback?.call(key);
      await Future.delayed(Duration(milliseconds: delayed ?? 50));
    }
    _stopCallback?.call(key);
  }

  ///结束执行[Executor]
  ///[callback]只会在进程结束时执行一次
  stop({Function(GroupKey key)? callback}) {
    _stop = true;
    _stopCallback = callback ?? _stopCallback;
  }

  ///是否已启动
  bool isStart() {
    return !_stop;
  }

  @override
  int get hashCode => key.hashCode;

  @override
  bool operator ==(Object other) =>
      other is! Executor ? false : key == other.key;
}

monitor.dart

import 'package:kq_flutter_widgets/utils/str_util.dart';

///合并执行状态持有
class Monitor {
  dynamic extra;
  bool _isStart = false;
  bool _isFinish = false;
  bool _isError = false;

  Monitor({this.extra});

  ///该方法接口开始调用时调用
  @Deprecated("只需要监听完成,不需要监听开始,创建即开始")
  onStart() {
    _isStart = true;
  }

  ///该方法接口调用完成时调用
  onFinish() {
    _isFinish = true;
  }

  ///该方法接口出错或者请求失败时调用
  onError() {
    _isError = true;
  }

  ///该接口是否已开始调用
  @Deprecated("只需要监听完成,不需要监听开始,创建即开始")
  bool isStart() {
    return _isStart;
  }

  ///该接口是否已完成调用
  bool isFinish() {
    return _isFinish;
  }

  ///该接口是否调用出错
  bool isError() {
    return _isError;
  }

  ///获取额外数据
  T? getExtra<T>() {
    return StrUtil.getValue(extra);
  }

  ///重置,以便复用
  reset() {
    _isStart = false;
    _isFinish = false;
    _isError = false;
  }
}

str_util.dart

/// 字符串辅助类
class StrUtil {
  ///类型判断
  static T? getValue<T>(var value) {
    if (value == null) {
      return null;
    } else if (T == bool) {
      return (value == "1" || value == "true" || value is bool) as T;
    } else if (T == String) {
      return value as T;
    } else if (T == int) {
      return int.parse(value) as T;
    } else if (T == double) {
      return double.parse(value) as T;
    } else {
      return value;
    }
  }
}

combine_executor.dart

import 'package:kq_flutter_widgets/utils/ex/kq_ex.dart';

import 'core/executor.dart';
import 'core/group_key.dart';
import 'core/monitor.dart';

///合并执行代码,主要用到接口调用上,
///只监测接口执行过程,不涉及接口回调参数等处理。
///以最开始执行的接口开始回调[onStart]方法,
///以最后执行完成的接口回调[onFinish]方法。
///当第一个回调开始了,并已回调完成了,表示整个接口执行完毕,
///当第一个接口执行完毕后,还没开始执行第二个接口,则即使他们有共同的[GroupKey],
///他们也不能在一个处理周期中处理,我们把一个同一个[GroupKey]下执行的[onStart]和[onFinish],
///表示一个处理周期。
class CombineExecutor {
  ///执行的对象保存
  final Map<GroupKey, List<Monitor>> _combines = {};

  ///Executor 保存
  final List<Executor> _executors = [];

  final Function(GroupKey key)? onStart;
  final Function(GroupKey key)? onFinish;

  CombineExecutor({this.onStart, this.onFinish});

  _executor(GroupKey key) {
    Executor executor = Executor(key);
    if (!_executors.contains(executor)) {
      _executors.add(executor);
      onStart?.call(key);

      executor.start(callback: (key) {
        List<Monitor> combines = _getCombines(key);
        bool flag = true;
        for (Monitor combineMonitor in combines) {
          if (!combineMonitor.isFinish() && !combineMonitor.isError()) {
            flag = false;
            break;
          }
        }

        //表示最后一个都已执行完成
        if (flag) {
          executor.stop(callback: (key) {
            onFinish?.call(key);
            _clearCombine(key);
            _executors.remove(executor);
          });
        }
      });
    }
  }

  ///停止,在退出界面时调用
  stop() {
    for (Executor executor in _executors) {
      executor.stop();
    }
    _executors.clear();
    _clearAllCombine();
  }

  ///获取合并执行观察者,
  ///设置到请求逻辑中。
  Monitor getCombine(GroupKey key) {
    Monitor combineMonitor = Monitor();
    _addCombine(key, combineMonitor);
    _executor(key);
    return combineMonitor;
  }

  ///新增一个CombineMonitor
  _addCombine(GroupKey key, Monitor combine) {
    if (key.isMonitor) {
      if (_combines.containsKey(key)) {
        List<Monitor>? combines = _combines[key];
        combines ??= [];
        if (!combines.contains(combine)) {
          combines.add(combine);
        }
      } else {
        _combines.putIfAbsent(key, () => [combine]);
      }
    }
  }

  List<Monitor> _getCombines(GroupKey key) {
    if (_isEmptyCombine(key)) {
      return [];
    } else {
      return _combines[key]!;
    }
  }

  ///CombineMonitor是否为空
  _isEmptyCombine(GroupKey key) {
    return !_combines.containsKey(key) || _combines[key].isNullOrEmpty;
  }

  _clearCombine(GroupKey key) {
    _combines.remove(key);
  }

  ///清除全部的CombineMonitor
  _clearAllCombine() {
    _combines.clear();
  }
}

///测试
class Test {
  test() {
    ///创建一个GroupKey,改key可用于一组需要调用的接口上
    GroupKey groupKey = GroupKey();

    ///创建对象
    CombineExecutor executor = CombineExecutor(
      onStart: (key) {
        ///print("执行了onStart");
      },
      onFinish: (key) {
        if (key == groupKey) {
          ///print("执行了onFinish");
        }
      },
    );

    ///获取CombineMonitor 传入到接口调用中
    Monitor monitor = executor.getCombine(groupKey);

    ///模拟异步对Monitor进行操作
    Future.delayed(const Duration(seconds: 2), () {
      monitor.onFinish();
    });

    ///退出界面
    executor.stop();
  }
}

3.使用

Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。,flutter,Dart,flutter,Dart文章来源地址https://www.toymoban.com/news/detail-703811.html

到了这里,关于Flutter实现CombineExecutor进行多个异步分组监听,监听第一个异步执行的开始和最后一个异步执行结束时机。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# Socket通信从入门到精通(16)——单个同步UDP服务器监听多个客户端C#代码实现

    我们在开发UDP通信程序时,有时候我们也需要开发UDP服务器程序,这个服务器只需要和一个客户端实现通信,比如这篇博文C# Socket通信从入门到精通(15)——单个同步UDP服务器监听一个客户端C#代码实现,但是在实际项目中有的时候需要和多个客户端进行通信,这时和一个客

    2024年01月22日
    浏览(41)
  • Spring Boot实现对超大文件进行异步压缩下载

     在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API,通过该API,用户可以下载问价为ZIP压缩文件。 首先,确保你已经创建了一个

    2024年02月07日
    浏览(39)
  • 如何在Spring Boot服务端实现公网远程调试并进行HTTP服务监听

    转载自cpolar内网穿透的文章:Springboot服务端接口公网远程调试,并实现HTTP服务监听 前后端分离项目中,在调用接口调试时候,我们可以通过cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试,本次教程我们以Java服务端接口为例。 JDK1.8 IDEA SpringBoot Maven Tomcat9.

    2024年02月06日
    浏览(102)
  • 使用多个神经网络进行细菌分类(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 使用多

    2024年02月15日
    浏览(24)
  • vue watch监听多个数据

    项目驱动 在自己工作的某个项目中,之前基本都是使用watch监听单个数据。 但是后面在一个echarts的项目中,使用了三个echarts图表,而三个图表需要根据用户的选择条件同时更新,而后端传过来的数据我们需要分割成两个数组,这个时候,单独监听一个数组已经达不到项目需

    2024年02月15日
    浏览(28)
  • flutter使用getx进行数据状态管理,实现页面响应式

    无论是什么样的应用,都还是需要最基础的数据来支撑的,而且不同的页面之间可能需要共享数据状态,这就显得数据状态管理非常有必要了。因为我这里使用了get依赖库,所以就可以直接在项目中使用getx来管理状态,不想再使用别的框架了。而且getx使用起来也挺方便的。

    2024年01月22日
    浏览(34)
  • unity AddListener监听多个参数方法

    toggle_titleShow.onValueChanged.AddListener(delegate { SetTitleShow(toggle_titleShow.isOn, 0); }); 在有for循环时,在使用delegate或者lambda表达式,需要使用临时变量 for (int i = 1; i m_ListData.Count; ++i) { for (int j = 1; j m_ListData[i].transform.childCount; j++) { int temp1 = i; int temp2 = j; m_ListData[i].transform.GetChild(j).GetC

    2024年02月14日
    浏览(30)
  • flutter监听键盘输入做出反应

    2024年02月10日
    浏览(30)
  • flutter 调出键盘和监听输入

    调出键盘: 监听按键: 完整代码

    2024年02月10日
    浏览(32)
  • Flutter ValueNotifier 监听数据变化

    系统提供了 ValueNotifier 组件的实现数据监听,局部刷新: 监听数据: 更新数据:

    2024年02月16日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包