Dart-異步編程

isolate

Dart是基于單線程模型的語言。
但是我們?cè)陂_發(fā)中也會(huì)有請(qǐng)求網(wǎng)絡(luò)這樣的耗時(shí)操作赃泡,所以Dart也有并發(fā)機(jī)制寒波,稱為isolate
Dart中的isolate無法共享內(nèi)存升熊。

Future

通常異步函數(shù)返回的對(duì)象就是一個(gè)Future俄烁。
當(dāng)一個(gè)Future執(zhí)行完后,可以使用then()來處理返回的結(jié)果级野。
Future對(duì)象其實(shí)就代表了在事件隊(duì)列中的一個(gè)事件的結(jié)果页屠。

基本使用

File(r"D:\xxx\xxx\xxx.txt")
    // File().readAsString()返回Future<String>
    .readAsString()
    // 可使用then來接收Future<String>返回的值
    .then((value) => print(value))
    // 可使用catchError來捕獲異常信息
    .catchError((s) => print(s));

串行組合

File(r"D:\xxx\xxx\xxx.txt").readAsString().then(
  (value) {
    print(value);
    return 1; //return將轉(zhuǎn)換為Future<int>返回,所以后續(xù)可以繼續(xù)使用then調(diào)用
  },
).then((value) => print(value));

并行組合

Future f1 = Future.delayed(Duration(seconds: 3), () {
  return 1;
});
Future f2 = Future.delayed(Duration(seconds: 5), () {
  return 3;
});
Future.wait([f1, f2]).then((value) {
  print(value[0]); // 返回f1的值
  print(value[1]); // 返回f2的值
});

async & await

可以使用asyncawait關(guān)鍵字蓖柔,將異步代碼寫成同步的形式辰企,可以有效得解決回調(diào)地獄的問題。
await必須在async方法內(nèi)使用渊抽。
該方法必須返回voidFuture蟆豫;如果該方法返回值是一個(gè)Future,則將自動(dòng)轉(zhuǎn)換懒闷。

void main() async {
  var result = await readTxt();
  print(result);
}

Future<String> readTxt() async {
  var result = await File(r"D:\xxx\xxx\xxx.txt").readAsString();
  // 可以使用async和await關(guān)鍵字十减,將異步代碼寫成同步的形式,可以有效得解決回調(diào)地獄的問題
  // await必須在async方法內(nèi)使用
  print(result.runtimeType);
  print(result);
  // 如果該方法返回值是一個(gè)Future愤估,則將自動(dòng)轉(zhuǎn)換
  return result;
}

Stream

Stream是一個(gè)異步數(shù)據(jù)源帮辟,是處理異步事件流的統(tǒng)一API。

單訂閱模式

// 通過Stream打開文件
Stream<List<int>> stream = File(r"D:\xxx\xxx\xxx.txt").openRead();

/// 默認(rèn)單訂閱模式
// 設(shè)置監(jiān)聽玩焰,返回一個(gè)訂閱者
var listen = stream.listen((event) {
  print("listen");
});
// 調(diào)用cancel方法取消訂閱
listen.cancel();
// onData會(huì)替換掉之前設(shè)置的listen或onData方法
listen.onData((data) {
  print("onData");
});
// onData會(huì)在訂閱者完成所有通知后執(zhí)行由驹,即可以做收尾工作
listen.onDone(() {
  print("onDone");
});
// 暫停訂閱者
listen.pause();
// 恢復(fù)訂閱者
listen.resume();
// 單訂閱模式不支持添加兩個(gè)訂閱者,會(huì)拋異常
var listen2 = stream.listen((event) {
  print("listen2");
});

單訂閱模式不支持添加兩個(gè)訂閱者,會(huì)拋異常

廣播模式(多訂閱)

// 通過Stream打開文件
Stream<List<int>> stream = File(r"D:\xxx\xxx\xxx.txt").openRead();

/// 廣播模式:多訂閱
/// 廣播可由單訂閱轉(zhuǎn)換而來
var broadcastStream = stream.asBroadcastStream();
broadcastStream.listen((event) {
  print("broadcastStream 1");
});
broadcastStream.listen((event) {
  print("broadcastStream 2");
});
broadcastStream.listen((event) {
  print("broadcastStream 3");
});

/// 直接創(chuàng)建一個(gè)廣播
var controller = StreamController.broadcast();
// 發(fā)送一個(gè)消息
controller.add("1");
// 設(shè)置一個(gè)監(jiān)聽(設(shè)置監(jiān)聽前發(fā)送消息無法收到)
controller.stream.listen((event) {
  print('接受廣播內(nèi)容:$event');
});
// 廣播用完記得close
controller.close();

由單訂閱轉(zhuǎn)換的廣播本質(zhì)還是單訂閱流蔓榄,所以添加訂閱者不會(huì)導(dǎo)致消息丟失并炮;
直接由StreamController創(chuàng)建的廣播,后注冊(cè)的訂閱者無法收到之前發(fā)出的消息甥郑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逃魄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澜搅,更是在濱河造成了極大的恐慌,老刑警劉巖癌瘾,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妨退,死亡現(xiàn)場(chǎng)離奇詭異概说,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)放典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門拱层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來径缅,“玉大人,你說我怎么就攤上這事氏堤∩撩剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铭乾。 經(jīng)常有香客問我,道長笛质,這世上最難降的妖魔是什么姓迅? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上夫偶,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好疾牲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布舌剂。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岩喷。 梳的紋絲不亂的頭發(fā)上鲸阔,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天妇穴,我揣著相機(jī)與錄音,去河邊找鬼隶债。 笑死死讹,一個(gè)胖子當(dāng)著我的面吹牛赞警,可吹牛的內(nèi)容都是我干的笤虫。 我是一名探鬼主播宁仔,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峦睡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翎苫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阻逮,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤粱快,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叔扼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體事哭,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年瓜富,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鳍咱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡与柑,死狀恐怖谤辜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情价捧,我是刑警寧澤丑念,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站结蟋,受9級(jí)特大地震影響脯倚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嵌屎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一推正、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宝惰,春花似錦植榕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炒瘸。三九已至,卻和暖如春夜郁,著一層夾襖步出監(jiān)牢的瞬間什燕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工竞端, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屎即,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓事富,卻偏偏與公主長得像技俐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子统台,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容