为什么 Future 会阻塞 ui 但网络请求不会出现抖动

Tur*_*sla 4 dart flutter

我知道 Future 将在事件队列中运行。但是事件队列也在主隔离上运行,如果我将来执行一些繁重的任务(例如,计算从 1 到 1000000 的总和),它将阻塞我的 ui 代码。 \n但是 Future 在网络操作不会阻塞UI(如await httpClient.getUrl(uri))。\n为什么使用future的网络请求需要几秒钟而不阻塞UI,而计算操作会阻塞UI\xef\xbc\x9f

\n\n
@override\nvoid initState() {\nsuper.initState();\nFuture((){\n  var result;\n  for (var i = 0; i < 1000000; ++i) {\n    result = 'result is $i';\n  }\n  print(result);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

如果我在 initState() 中使用 Future 执行一些繁重的任务,用户界面将被阻止。

\n

jam*_*lin 5

Dart 中的隔离是单线程的。孤立体一次只能做一件事。

异步函数基本上是协作多任务处理的一种形式。函数必须产生(通常通过await)以允许其他操作在隔离中执行。

您的计算不会产生结果,因此它必须在 UI 恢复处理事件之前完整运行,并且 UI 将无响应。如果你改变了它:

Future(() async {
  var result;
  for (var i = 0; i < 1000000; ++i) {
    result = 'result is $i';
    await Future.delayed(Duration.zero);
  }
  print(result);
});
Run Code Online (Sandbox Code Playgroud)

那么您应该会发现 UI 可以定期处理事件,并且应该具有保持响应的外观。(请注意,由于额外的开销,您的计算将需要更长的时间才能完成。)