第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Flutter 93: 圖解 Dart 單線程實(shí)現(xiàn)異步處理之 Isolate (二)

標(biāo)簽:
Android

      小菜刚学习了 Isolate 的部分基本用法,今天继续尝试 compute 及其使用方式;

Isolate

      小菜之前了解到 ReceivePortSendPort 是成对出现的,是 Isolate 之间唯一的消息通讯的方式;

ReceivePort

abstract class ReceivePort implements Stream {
  external factory ReceivePort();

  external factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort);

  StreamSubscription listen(void onData(var message),
      {Function onError, void onDone(), bool cancelOnError});

  void close();

  SendPort get sendPort;
}

      简单分析源码可得,ReceivePort 中通过 get 获取一个 SendPort 对象,通过 SendPort 发送消息到 ReceivePort 中,之后再通过 listen 进行监听;

SendPort

abstract class SendPort implements Capability {
  void send(var message);

  bool operator ==(var other);

  int get hashCode;
}

      SendPort 内容很简单,主要是通过 send 方法向 ReceivePort 传递消息;

Compute

      小菜尝试了 Isolate 的基本用法,需要使用 ReceivePortSendPort 来进行消息通讯;而 Flutter 提供了更简单的 Compute Function

源码分析

Future<R> compute<Q, R>(isolates.ComputeCallback<Q, R> callback, Q message, { String debugLabel }) async {
  ...
  final Isolate isolate = await Isolate.spawn<_IsolateConfiguration<Q, FutureOr<R>>>(_spawn,
    _IsolateConfiguration<Q, FutureOr<R>>(
      callback, message,
      resultPort.sendPort,
      debugLabel, flow.id,
    ),
    errorsAreFatal: true,
    onExit: resultPort.sendPort,
    onError: errorPort.sendPort,
  );
  final Completer<R> result = Completer<R>();
  errorPort.listen((dynamic errorData) {
    ...
  });
  resultPort.listen((dynamic resultData) {
    ...
  });
  await result.future;
  Timeline.startSync('$debugLabel: end', flow: Flow.end(flow.id));
  resultPort.close();
  errorPort.close();
  isolate.kill();
  Timeline.finishSync();
  return result.future;
}

      简单了解源码,Compute 实际是对 Isolate 的封装,Compute 是通过 Isolate.spawn() 方式来处理 Isolate 其中 compute() 方法中在通讯结束后自动进行 Isolate.kill() 销毁;且 compute() 直接返回内容,无需考虑 listen 监听等;

案例尝试

      compute() 包含两个必填参数,第一个是定义新的 Isolate 的核心执行方法,第二个是函数对应的参数,可以是多个任意类型;因为 compute 实际是通过 Isolate.spawn() 来处理的,则对应的耗时方法也需要是在顶级 main 函数中或 static 方法;

_loadIsolateDate04() async {
  print('main Isolate, current Isolate = ${Isolate.current.hashCode}');
  print(await compute(getName, ''));
}

static String getName(String name) {
  print('new Isolate, current Isolate = ${Isolate.current.hashCode}');
  sleep(Duration(seconds: 2));
  return '阿策小和尚';
}

      对于 compute() 的异常处理,可以通过 try-catch 进行捕获;

_loadIsolateDate05(bool isError) async {
  print('main Isolate, current Isolate = ${Isolate.current.hashCode}');
  try {
    print(await compute(_backgroundWork3, isError));
  } catch (e) {
    print(e);
  }
}

static _backgroundWork3(bool isError) async {
  print('new Isolate, current Isolate = ${Isolate.current.hashCode}');
  if (!isError) {
    return await Future.delayed(Duration(seconds: 2), () {
      return 'BackgroundWork delayed 2s -> currentTime -> ${DateTime.now().millisecondsSinceEpoch}';
    });
  } else {
    return await Future.error(ArgumentError.notNull('Input'));
  }
}




      小菜对 Isolate 的源码还未深入研究,仅停留在应用层;如有错误请多多指导!

来源: 阿策小和尚

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
移動(dòng)開發(fā)工程師
手記
粉絲
168
獲贊與收藏
165

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消