第二百九十八回

2024-02-01 08:20
文章标签 第二百 九十八

本文主要是介绍第二百九十八回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 概念介绍
  • 2. 方法与原理
    • 2.1 实现方法
    • 2.2 实现原理
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中介绍了"再谈showMenu的用法",本章回中将介绍如何实现每隔一段时间执行某项任务.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

在实际项目中会有定时执行任务的需求,比如每隔1秒去发送网络心跳包,对于这样的需求,可以通过Stream.periodic(Duration,(){}).take(times)来实现,
再配合StreamProvider或者StreamBuilder就可以监听Stream中的事件。本章回中将介绍详细的使用方法。

2. 方法与原理

2.1 实现方法

介绍完概念后,我们看看如何实现这个概念,下面是具体的实现方法:

  • 创建一个Stream,并且调用它的priodic方法来执行定期任务;
  • 创建一个StreamBuilder,用来监听Stream中的事件;
  • 通过StreamBuilder中的buidler属性获取Stream中的事件;
  • 获取事件后,可以依据事件中的数据实现相关的逻辑业务处理;

2.2 实现原理

上面的实现方法中使用StreamBuilder来监听Stream中的事件,这个容易理解,我们重点看看Stream是如何实现每隔一段时间执行某项任务的,下面是它的源代码:

 factory Stream.periodic(Duration period,[T computation(int computationCount)?]) {if (computation == null && !typeAcceptsNull<T>()) {throw ArgumentError.value(null, "computation","Must not be omitted when the event type is non-nullable");}var controller = _SyncStreamController<T>(null, null, null, null);// Counts the time that the Stream was running (and not paused).Stopwatch watch = new Stopwatch();controller.onListen = () {int computationCount = 0;void sendEvent(_) {watch.reset();if (computation != null) {T event;try {event = computation(computationCount++);} catch (e, s) {controller.addError(e, s);return;}controller.add(event);} else {controller.add(null as T); // We have checked that null is T.}}Timer timer = Timer.periodic(period, sendEvent);controller..onCancel = () {timer.cancel();return Future._nullFuture;}..onPause = () {watch.stop();timer.cancel();}..onResume = () {Duration elapsed = watch.elapsed;watch.start();timer = new Timer(period - elapsed, () {timer = Timer.periodic(period, sendEvent);sendEvent(null);});};};return controller.stream;}

从上面的源代码中可以看到,该代码主要通过Timer来实现定期执行某项任务,不过它也有一些局限性,因为event的值递增的(computation(computationCount++))。如果使用StreamProvider指定初始值,但是它还会回到原来的默认值,比如指定泛型为int,初始值为3,它开始运行时值为3,指定时间到了后又变成了默认值0.此后
这个值进行递增,直到执行times次后停止。

3. 示例代码

///每隔1s运行一次,一共运行3次final Stream<int> _stream2 = Stream.periodic(const Duration(seconds: 1,),(count) => (count+1)).take(3);StreamBuilder<int>(stream: _stream2,builder: (context,data){var str = data.data == null? 'no value' : data.data.toString();return Text("value of Stream: $str");},),

上面的示例完全按照实现方法中的步骤来编写,代码中实现了一个定期任务:第隔1秒运行一次,一共运行3次。

4. 内容总结

最后,我们对本章回的内容做一个全面的总结:(代码在050文件中)

  • 通过Stream的periodic方法可以实现定期任务;
  • Stream中的periodic方法本质上是通过Timer实现的;
  • Stream中的periodic方法只能递增,具有一定的局限性;
    看官们,与"如何实现每隔一段时间执行某项目任务"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

这篇关于第二百九十八回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666661

相关文章

leetcode解题思路分析(九十八)846 - 852 题

一手顺子 爱丽丝有一手(hand)由整数数组给定的牌。 现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。如果她可以完成分组就返回 true,否则返回 false。 记录每个牌是否用过,排序后依次找即可 class Solution {public:bool isNStraightHand(vector<int>& hand, int groupSize) {in

每天一个数据分析题(四百九十八)- Apriori算法

Apriori算法中,候选序列的个数比候选项集的个数大得多,产生更多候选的原因有? A. 一个项在项集中最多出现一次,但一个事件可以在序列中出现多次 B. 一个事件在序列中最多出现一次,但一个项在项集中可以出现多次 C. 次序在序列中和项集中都是重要的 D. 序列不可以合并 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖

第二百零九节 Java格式 - Java数字格式类

Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance()方法返回格式化

第二百零四节 Java正则表达式教程 - Java正则表达式量词

Java正则表达式教程 - Java正则表达式量词 我们可以指定正则表达式中的字符的次数可以匹配字符序列。 为了使用正则表达式表达一个数字或更多的模式,我们可以使用量词。 下表列出了量词及其含义。 量词含义*零次或更多次+一次或多次?一次或根本不{m}正好m次{m,}至少m次{m,n}至少m,但不超过n次 量词必须遵循字符或字符类。 例子 import java.util.reg

第四百九十八回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容,本章回中将介绍使用get显示SnackBar.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在介绍Get包时提到该提供了一些实用功能,显示SnackBar就是其中之一,本章回中

一起Talk Android吧(第二百三十七回:Android中的Intent)

各位看官们大家好,上一回中咱们说的是Android中四大组件的例子,这一回咱们说的例子是Intent。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在本章回中将介绍Intent,它也是常用的知识,四大组件中有三大组件都使用它,比如打开Activity,绑定服务,发送广播。我们在代码中都看到过Intent的身影。 Intent可以显式和隐式两种; 显式Intent中包含

一起Talk Android吧(第二百三十六回:Android中的四大组件概述)

各位看官们大家好,上一回中咱们说的是Android中数据存储大结局的例子,这一回咱们说的例子是四大组件。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在这一回中介绍一下Android中的四大组件,它们是 ActivityServiceBroadcastContentProvider。 其实这些内容我们都介绍过,接下来我们一起回顾一下这些知识. Activity是程

一起Talk Android吧(第二百三十四回:Android中的数据存储之ContentProvider二)

各位看官们大家好,上一回中咱们说的是Android中数据存储之ContentProvider的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,我们在上一回中介绍了如何通过ContentProvider读取联系人模块中的数据,下面是完整的代码,请大家参考: package com.example.talk8.blogappall;import a

一起Talk Android吧(第二百三十二回:Android中的数据存储之ContentProvider概述)

各位看官们大家好,上一回中咱们说的是Android中数据存储之数据库的例子,这一回咱们说的例子是ContentProvider。闲话休提,言归正转。让我们一起Talk Android吧! 看官们,contentProvider也叫内容提供器,它主要用来在应用程序之间共享数据,因此,我们把它当作一种数据存储方式。它通常有两种使用场景: 使用它访问其它应用中的数据;定义它并且提供接口让其它程序来访

漫话Redis源码之九十八

这里需要关注的就是hash_set, 前面的注释已经比较明确了: /* If a string is ":deleted:", the special value for deleted hash fields is* returned; otherwise the input string is returned. */static RedisModuleString *value_or_d