文章目录
- [1. 概念介绍](#1. 概念介绍)
- [2. 使用方法](#2. 使用方法)
-
- [2.1 async和awit配合使用](#2.1 async和awit配合使用)
- [2.2 Future类单独使用](#2.2 Future类单独使用)
- [3. 示例代码](#3. 示例代码)
我们在上一章回中介绍url_launcher包相关的内容,本章回中将介绍如何Flutter中的异步操作.闲话休提,让我们一起Talk Flutter吧。
1. 概念介绍
异步操作是程序中不可缺少的内容,大部分面向对象语言和编程框架都提供了异步操作,一些三方公司也推出了异步库,比如我们在Android专栏中介绍的Rxjava库.
Flutter也提供了异步操作,实现异步操作会用到Future和Stream类,以及Dart语言中的async和await关键字。本章回中将介绍异步操作相关的用法。
2. 使用方法
2.1 async和awit配合使用
async关键字通常在方法名后面,表示该方法是异步方法。在方法体中使用await关键字修饰某个操作,表示等待该操作完成后再执行该操作后面的其它程序语句。稍后
我们将在示例代码中演示它们的用法。注意:这两个关键字必须配合在一起使用,不能单独使用。async关键字修饰的方法默认返回Future类型的对象。
2.2 Future类单独使用
Future类提供了很多静态方法来实现异步操作,比如延时操作,等待操作等,而且这些操作支持链式调用,使用起来十分方便。它和我们前面介绍的RxJava框架十分类
似,如果大家了解RxJava的话,很快就能上手Future类相关的操作。下面是常用的静态方法与功能:
- wait方法:表示执行等待操作,等当前操作完成后才会去运行其它的操作;
- delayed方法:表示延时执行某个任务,时间通过参数来指定;
- then方法:表示接着执行某个操作,它通常位于wait方法后面;
- catchError方法:如果执行异步操作过程中发生错误,那么会回调此方法;
- whenComplete方法:异步操作执行完成后会回调此方法
3. 示例代码
dart
//async和await关键字示例代码
_syncFun() async {
await do one
do two //只有do noe操作完成后才执行该操作
}
//Future类示例代码
_syncLaunch() {
print("func start");
Future.wait([
Future.delayed(Duration(seconds: 3),() {
print("launch url");
launchUrl(Uri.parse('https://pub.dev'));
})
])
.then((value) => print("then running"))
.catchError((e){
print("error: "+e.toString());
})
.whenComplete(() => print("complete running"));
print("func end");
}
上面的代码中,async和await关键字的示例程序是伪代码,大家明白其中的运行过程就可以。Future操作的代码可以运行,下面是程序的运行结果,从运行结果中可以看到,start和end很快就运行完成了,异步操作需要等待3秒后才可以运行,先是运行wait方法中加载url的操作,然后是then方法中的操作,最后是whenComplete方法中的操作。因为整个运行过程没有发生异常,所以没有执行catchError方法中的程序。
flutter: func start
flutter: func end
flutter: launch url
flutter: then running
flutter: complete running
Future可以实现异步,但是它不是多线程。这点和java不一样。Future实现异步是通过消息队列实现的,详细的细节先不看。Future.delay()就是把事件放到消息
队列中,还有一个比消息队列优先级高的队列microtask.Futuere会优先执行这里的事件,这里没有事件后才去消息队列中拿事件。我们可以通过microtask()这个
静态方法把事件添加到这个队列中。注意:并不是所有Future相关的内容都是异步执行,比如Future.vaule()就是马上执行,但是构造方法创建的Future对象是异
步执行。
看官们,关于"Flutter中异步操作"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!