在这里插入图片描述

一、Isolate概述

Isolate是Dart的独立执行单元,每个Isolate有自己的内存堆,不共享内存。

compute

执行耗时任务

返回

主Isolate

工作Isolate

计算结果

更新UI

二、compute函数

static int _fibonacci(int n) {
  if (n <= 1) return n;
  return _fibonacci(n - 1) + _fibonacci(n - 2);
}

Future<int> _computeFibonacci(int n) async {
  return await compute(_fibonacci, n);
}

三、执行耗时任务

Future<void> _startCompute() async {
  setState(() {
    _isComputing = true;
    _error = null;
    _result = null;
  });

  try {
    _result = await _computeFibonacci(40);
    setState(() {
      _isComputing = false;
    });
  } catch (e) {
    setState(() {
      _error = e.toString();
      _isComputing = false;
    });
  }
}

四、单线程 vs 多线程

斐波那契第40项计算时间对比 主线程 Isolate 14 12 10 8 6 4 2 0 耗时(秒)
方式 UI响应 耗时 适用场景
主线程 阻塞 简单计算
Isolate 流畅 耗时计算

五、工作原理

耗时任务 Worker Isolate compute函数 主线程UI 耗时任务 Worker Isolate compute函数 主线程UI 调用compute(task, 40) 创建Isolate 执行_fibonacci(40) 递归计算 返回结果 发送结果 返回Future完成 setState更新

六、使用场景

需要计算

耗时 > 16ms?

主线程执行

使用compute

任务可序列化?

使用compute

使用Isolate

直接更新UI

等待结果

更新UI

要点

  • compute适合简单耗时任务
  • 传入函数必须是静态或顶层函数
  • 参数必须可序列化
  • 不阻塞UI线程

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐