返回

Flutter 多线程到底该怎么玩?

IOS


作为 Flutter 开发者,我们必须知道,Flutter 默认是单线程任务处理的。也就是说,如果不开启新的线程,任务默认在主线程中处理。这与 iOS 应用很像,在 Dart 的线程中也存在事件循环和消息队列的概念,但在这其中,Flutter 把线程叫做 isolate。应用程序启动后,会开始执行 main 函数并运行 main isolate。每个 isolate 都有自己的内存空间和事件循环,并且相互之间是独立运行的。


Flutter 在单线程中使用事件循环来处理所有的任务。事件循环是一个不断循环的过程,它不断地从事件队列中取出事件并执行。当有新的事件加入到事件队列时,事件循环就会被唤醒,并开始处理这些事件。Flutter 使用事件循环来处理所有的事情,包括 UI 渲染、网络请求、文件操作等。


由于 Flutter 是单线程的,因此如果我们在主线程中执行耗时任务,就会导致 UI 卡顿。为了避免这个问题,我们可以使用 isolate 来创建新的线程来执行耗时任务。isolate 是 Dart 中的线程,它与主线程是相互独立的。我们可以使用 isolate 来执行耗时任务,这样就不会影响到主线程的运行。


使用 isolate 来创建新的线程非常简单,我们只需要创建一个新的 isolate 对象,然后调用 isolate 的 spawn 方法即可。spawn 方法会创建一个新的 isolate,并在其中执行指定的函数。


import 'dart:isolate';

void main() {
  // 创建一个新的 isolate
  Isolate isolate = Isolate.spawn(myFunction, "Hello");

  // 等待 isolate 完成任务
  isolate.addOnExitListener((_) {
    print("isolate completed");
  });
}

void myFunction(String message) {
  // 在 isolate 中执行耗时任务
  sleep(Duration(seconds: 10));

  // 任务完成,打印消息
  print(message);
}

上面的代码中,我们创建了一个新的 isolate,并在其中执行了 myFunction 函数。myFunction 函数在 isolate 中执行了耗时任务,然后打印了消息 "Hello"。由于 myFunction 函数是在 isolate 中执行的,因此它不会影响到主线程的运行。


使用 isolate 来创建新的线程非常简单,我们可以使用这种方式来避免在主线程中执行耗时任务,从而保证 UI 的流畅性。