Dart语言面向对象程序设计
- 异步
-
- Future
-
- 1.异步读文件
- 2.同步读文件
- async和await
- Stream
异步
Future
Future表示在将来某时获取一个值的方式,当一个返回Future方法被调用时,该方法会把要执行的某事件放入队列,并返回一个未完成的Future对象,在该事件执行完毕后,Future对象的状态会自动变成已经完成,此时可以通过then链式调用或async和await获取该事件的返回值,并对返回值进行相应处理。
例:定义1个从指定文件异步读出文件内容的方法,并将文件内容输出。
1.异步读文件
Dart语言中通过File对象的readAsSting()方法异步读取文件,该方法返回的一个Future<String>对象,Future有一个then方法,该方法如下:
Future<R> then<R>(
FutureOr<R> onValue(
T value
),{
Function onError
});
2.同步读文件
Dart语言中同样也提供了同步读文件机制,即调用File类的同步读文件方法readAsStringSync()读文件时,需要等文件读完后才能执行后面的功能模块。
例:定义1个从指定文件同步读出文件内容的方法,并将文件内容输出。
(1)定义readFileSync()方法
String readFileSync(String filePath){
File file = File(filePath);
return file.readAsStringSync();
}
(2)定义main()方法
void main(){
print('start');
String info = readFileSync("temp/info.txt");
print(info); //输出读出的文件内容
print('end');
}
async和await
Dart语言中提供了async和await机制,让异步任务的执行看起来和同步代码的执行顺序一致。
async用来表示定义的方法是异步执行的,该方法会返回一个Future对象;await后面也是一个Future对象,表示该异步任务完成,只有异步任务执行完成后才会继续执行后面的任务代码。
async的作用就是标记一个方法是异步方法;await的作用是等待异步任务的结果。
例:用async和await机制实现异步读文件,并产生如前例所示输出效果:
void mian() async {
print('start');
String info = await reaFile("temp/info.txt");
print(info);
print('end');
}
使用async和await实现代码异步执行机制包含以下四个要点:
(1)await只能在标记了async的异步方法中使用,否则报错;
(2)当使用async作为方法名后缀声明时,说明这个方法的返回值是一个Future类型;
(3)当执行到该方法中用await标注的代码时,会暂停该方法其他部分的代码执行;
(4)当await标注的代码引用的Future类型返回值执行完成,await标注的代码后的下一行代码会立即执行。
Stream
Stream和Future是Dart语言实现异步处理机制的核心API,用Future实现异步处理时,所有异步操作的返回值都是有Future表示,但是Future只能表示一次异步获得的数据,而Stream实现异步事件流的处理,它表示多次异步获得的数据。
采用Stream方式读文件内容时,一般情况下每次可以读取一部分数据,并进行相应的处理。
例:定义1个用Stream方式从指定文件读出文件内容的方法,并将文件内容输出。
openRead()方法返回一个Sream<List<int>>类型的数据,也就是一个存放了int类型数组的数据流。在获得一个Stream实例对象后,就是通过listen()方法订阅Stream上发出的数据(即事件),有事件发出时就会通知订阅者进行相应的事件处理。listen()方法如下:
StreamSubscription<T> listen(
void onData(T event),
{
Function onError,
void onDone(),
bool cancelOnError}
);