首页 > 其他分享 >Flutter中如何取消任务

Flutter中如何取消任务

时间:2023-04-02 09:04:13浏览次数:35  
标签:dio 取消 any 任务 Future Flutter CancelToken

前言

在开发过程中,取消需求是很常见的,但很容易被忽略。然而,取消需求的好处也很大。例如,在页面中会发送很多请求。如果页面被切走并处于不可见状态,就需要取消未完成的请求任务。如果未及时取消,则可能会导致以下负面影响:

  1. 消耗用户额外数据流量。
  2. 任务回调持有全局上下文变量,未及时释放存在内存泄漏风险
  3. 异步请求过多消耗大量系统资源,拖慢 UI 线程,造成卡顿。

在 Flutter 中,如何取消已经在进行的任务呢?首先需要掌握一些基础知识。

前置知识

Future#any 方法

传入一个 Future 任务列表,返回第一个完成的异步任务,无论成功或失败。

定义

用法

如下 5 个异步任务,代码第五行虽然第二执行,但是最先执行完毕,所以第一个返回,至此整个 Future.any 函数执行完毕。

结果输入如下:

总结

  • Future.any 实际就是一个 Completer,N 个 Future 叠加在一起,谁先完成算谁的。
  • Future.any 可以理解成百米赛跑,其中每个选手就是一个 Future,谁跑最快到终点谁就赢了。

Dio 取消实现解析

dio 版本

dio: dev v5.0.3

git: 67f07b86a0976c14a6e19061563832d92ed6772b

branch: main

如何取消

请求中传入 CancelToken 对象,然后调用 token.cancel 方法即可

final cancelToken = CancelToken();
dio.get(url, cancelToken: cancelToken).catchError((DioError err) {
  if (CancelToken.isCancel(err)) {
    print('Request canceled: ${err.message}');
  } else{
    // handle error.
  }
});
// Cancel the requests with "cancelled" message.
token.cancel('cancelled');

流程解析

思路:在实际任务执行前使用 Future.any 函数插入取消任务。如果实际任务没有执行完,就有机会取消它。

如下代码,黄色标注按照步骤来读就行。

总结:CancelToken 就像一个渣男,而 Future.any 则提供了公平竞争的机会。只要妹子还没有交男朋友,渣男就有机会中途得手。

说明

取消任务不仅限于网络请求。任何实际业务中包含不必要的耗时操作都可以通过 Future.any 配合 CancelToken 来实现取消。

标签:dio,取消,any,任务,Future,Flutter,CancelToken
From: https://www.cnblogs.com/programmingBB/p/17279883.html

相关文章

  • cekery 定时任务
    1创建文件夹 clery_task2.创建一个celery的py文件fromceleryimportCeleryfromcelery.schedulesimporttimedelta#1实例化celery对象celery_app=Celery(#定义任务名称'celery_app',#缓存的数据库broker='redis://127.0.0.1:6379/1',#分......
  • Hangfire 定时任务设置某个时间区间每隔一定时间触发的Cron表达式
    Cron表达式Hangfire使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成。Cron表达式时间字段(从左到右依次为):位置时间域名允许值允许的特殊字符1秒0-59,-*/2分钟0-59,-*/3小时0-23,-*/4日期1-31......
  • 来回切换axios取消上一次请求,版本0.22
     method的方法 getCateApi   asyncgetCateApi(){//用户快速切换的时候取消上一个请求,要不然太卡了constaxiosSource=this.axios.CancelToken.source();this.cancelRequest={cancel:axiosSource.cancel};......
  • 定时任务@Scheduled中的cron 表达式和 fixedRated类配置参数
    1.cron表达式格式:@Scheduled(cron="******"){秒数}{分钟}{小时}{日期}{月份}{星期}{年份(可为空)}{秒数} ==>允许值范围:0~59,不允许为空值,若值不合法,调度器将抛出SchedulerException异常"*"代表每隔1秒钟触发;","代表在指定的秒数触发,比如"0,15,45"......
  • oracle 禁用job任务
    参考(17条消息)Oracle11g自带的系统Job介绍_oracle11gjob_shayuwei的博客-CSDN博客SQL>selectjob_namefromdba_scheduler_jobs;SQL>setlin160SQL>colownerfora10SQL>colDIRECTORY_NAMEfora25SQL>colDIRECTORY_PATHfora50SQL>select*fromd......
  • flutter基础2
    1.有状态组件StatefulWidgetimport'package:flutter/material.dart';voidmain(){runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnMaterialAp......
  • IDEA取消左键点击空白处时的光标跟随
      没有位于文末   ......
  • 实时聊天+任务管理应用Orchestra完成500万美元A轮融资
    最新消息,实时聊天+任务管理应用Orchestra宣布,关闭从CharlesRiverVentures和SVAngel获得的500万美元A轮融资。此前,Orchestra还从KaporCapital和其他天使投资人那获得了50万美元的种子资金。Orchestra的两位联合创始人 GentryUnderwood和ScottCan......
  • 取消VSCode右下角的错误提示弹窗
    用VSCode开发时,安装的插件时不时的在右下角出现错误弹窗,很烦。像这样的:  尝试在设置里面找找关掉,但是没有找到。通过网络找到了相应的办法,在此记录一下:找到VSCode安......
  • 创建剧本以开始新的编码任务
    您在平台竞标中中标了,或者,您已收到客户的要求。你做的第一件事是什么?有一本剧本很有价值。每次开始研究代码中的新更改时都要遵循的过程。它使您的工作更可预测、更完整......