深刻了解Flutter的isolate(2) --- 建立本身的isolate

0x00 前言

Flutter的代碼都是默認跑在root isolate上的,那麼Flutter中能不能本身建立一個isolate呢?固然能夠!,接下來咱們就本身建立一個isolate!bash

0x01 dart:isolate

有關isolate的代碼,都在isolate.dart文件中,裏面有一個生成isolate的方法:異步

external static Future<Isolate> spawn<T>(
      void entryPoint(T message), T message,
      {bool paused: false,
      bool errorsAreFatal,
      SendPort onExit,
      SendPort onError});
複製代碼

spawn方法,必傳參數有兩個,函數entryPoint和參數message,其中async

  1. 函數函數

    函數必須是頂級函數或靜態方法oop

  2. 參數ui

    參數裏必須包含SendPortspa

0x02 開始動手寫

建立的步驟,寫在代碼的註釋裏code

import 'dart:async';
import 'dart:io';
import 'dart:isolate';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

//一個普普統統的Flutter應用的入口
//main函數這裏有async關鍵字,是由於建立的isolate是異步的
void main() async{
  runApp(MyApp());
  
  //asyncFibonacci函數裏會建立一個isolate,並返回運行結果
  print(await asyncFibonacci(20));
}

//這裏以計算斐波那契數列爲例,返回的值是Future,由於是異步的
Future<dynamic> asyncFibonacci(int n) async{
  //首先建立一個ReceivePort,爲何要建立這個?
  //由於建立isolate所需的參數,必需要有SendPort,SendPort須要ReceivePort來建立
  final response = new ReceivePort();
  //開始建立isolate,Isolate.spawn函數是isolate.dart裏的代碼,_isolate是咱們本身實現的函數
  //_isolate是建立isolate必需要的參數。
  await Isolate.spawn(_isolate,response.sendPort);
  //獲取sendPort來發送數據
  final sendPort = await response.first as SendPort;
  //接收消息的ReceivePort
  final answer = new ReceivePort();
  //發送數據
  sendPort.send([n,answer.sendPort]);
  //得到數據並返回
  return answer.first;
}

//建立isolate必需要的參數
void _isolate(SendPort initialReplyTo){
  final port = new ReceivePort();
  //綁定
  initialReplyTo.send(port.sendPort);
  //監聽
  port.listen((message){
    //獲取數據並解析
    final data = message[0] as int;
    final send = message[1] as SendPort;
    //返回結果
    send.send(syncFibonacci(data));
  });
}

int syncFibonacci(int n){
  return n < 2 ? n : syncFibonacci(n-2) + syncFibonacci(n-1);
}
複製代碼

0x03 運行結果

直接運行程序就會在log裏看到以下的打印:事件

flutter: 6765
複製代碼

0x04 isolate有什麼用?

說了這麼久,爲何要建立本身的isolate?有什麼用?ci

由於Root isolate會負責渲染,還有UI交互,若是咱們有一個很耗時的操做呢?前面知道isolate裏是一個event loop(事件循環),若是一個很耗時的task一直在運行,那麼後面的UI操做都被阻塞了,因此若是咱們有耗時的操做,就應該放在isolate裏!

參考文章

hackernoon.com/are-futures…

相關文章
相關標籤/搜索