首先聲明Dart是單線程語(yǔ)言披坏,也就是說(shuō)它沒有像OC、Swift 那樣復(fù)雜的多線程控制廉邑。
也就可以理解為 Dart只有一個(gè)主線程,沒有其他線程倒谷。
Future蛛蒙、scheduleMicrotask(微任務(wù))、Isolate渤愁、Compute
Even Loop
Flutter 的 loop 優(yōu)先級(jí)講解 主線程任務(wù)優(yōu)先執(zhí)行 > scheduleMicrotask(微任務(wù))(其他微任務(wù))> Future -->當(dāng)前Future的then等回調(diào) > 其他Future --> 其他Future
Isolate牵祟、compute
嚴(yán)格來(lái)講 Isolate、compute(對(duì)Isolate的封裝)是正經(jīng)的多線程抖格,和iOS 多線程一樣,這是Dart給我們提供的一個(gè)多線程的一個(gè)接口诺苹。
Future
void getData() async {
print('開始data=$_data');
// 后面的操作 必須是異步才能用 await 修飾
// 當(dāng)前函數(shù)必須是 異步函數(shù) 才能用 await 修飾
// await Future((){
//
// for (int i = 0; i < 10000000; i++) {
// _data = '好事';
//
// }
//
// });
// print('介紹data=$_data');
// 如果不想用 await 阻塞當(dāng)前線程 可以用 回調(diào)方式 。
Future future = Future((){
for (int i = 0; i < 10000000; i++) {
_data = '好事';
// return '網(wǎng)絡(luò)數(shù)據(jù)';
// 如果出現(xiàn)異常 可以
return throw Exception('網(wǎng)絡(luò)異常');
}
});
// 使用 then 這個(gè)函數(shù)來(lái)接收回調(diào)
// future.then((value) => print(value));
// print('在干點(diǎn)其他事情');
// future.catchError((error){
// print('捕獲到了${error.toString()}');
// });
// 根據(jù)上面 我們可以這么寫 先捕獲異常 再捕獲 回調(diào)
// 這樣 仍然會(huì) 走 then 但是不會(huì)拋錯(cuò)
future.catchError((error){
print(error);
}).then((value) => print(value)).whenComplete(() => print('完成'));;
// 如果不想走 then
future.then((value){print('object');}, onError: (error){}).whenComplete(() => print('完成'));
// 是不是 和 Rx 一毛一樣 沒什么學(xué)習(xí)成本
}
通過(guò)這個(gè)方法就可以看到 Flutter 的優(yōu)先級(jí)相同異步任務(wù) 和 原生的 區(qū)別 雹拄, 他會(huì)按順序執(zhí)行異步任務(wù)收奔,這也可以理解Flutter只會(huì)有一個(gè)主線程不會(huì)有任何其他線程。
void textFuture() {
Future((){sleep(Duration( seconds: 2)); return '任務(wù)1';}).then((value) => print('$value結(jié)束'));
Future((){return '任務(wù)2';}).then((value) => print('$value結(jié)束'));
Future((){return '任務(wù)3';}).then((value) => print('$value結(jié)束'));
Future((){return '任務(wù)4';}).then((value) => print('$value結(jié)束'));
/// iOS 線程間依賴 --- Flutter 任務(wù)依賴
///
///
Future((){
return '依賴的前置條件任務(wù) 5 ';
}).then((value) {
print('$value完成');
return '執(zhí)行條件語(yǔ)句任務(wù) 6';
}).then((value) {
print('$value完成');
// return '執(zhí)行接下來(lái)的語(yǔ)句';
}).then((value) {
print(value == null ? '未拋出任何數(shù)據(jù)' : value) ;
return value == null ? throw Exception('異常') : value;
} ).catchError((error) => print(error)).whenComplete(() => '所有任務(wù)complete');
}
Future 的編程組 DispatchGroup
Future.wait Future.wait([異步1, 異步2])
void textFuture2(){
Future.wait([Future((){
return '任務(wù)1';
}),
Future((){
return '任務(wù)2';
}),]).then((value) => print(value[0] + value[1]));
}
/// cumpute 封裝 Isolate 不需要管理生命周期
void computeTest() async {
print('外部代碼1');
int x = await compute(func1, 10);
print(x);
print('外部代碼2');
}
int func1(int count){
return 1000;
}
/// 雖然是 單線程語(yǔ)言 但是仍可以實(shí)現(xiàn)多線程 Isolate
/// 不用擔(dān)心多線程數(shù)據(jù)搶奪的問(wèn)題 办桨。 但是數(shù)據(jù)交互比較麻煩
/// 利用 port 傳遞參數(shù)
void test1() async {
print('外部代碼1');
ReceivePort port = ReceivePort();
Isolate iso = await Isolate.spawn(func, port.sendPort);
port.listen((message) {
print(message);
port.close();
iso.kill();
});
sleep(Duration(seconds: 1));
print('外部代碼2');
}
void func(SendPort send){print('搞定!');send.send(100000);}