为什么Future会阻止ui,但网络请求却不会动摇

时间:2019-06-27 03:14:09

标签: flutter dart

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

@override
void initState() {
super.initState();
Future((){
  var result;
  for (var i = 0; i < 1000000; ++i) {
    result = 'result is $i';
  }
  print(result);
});

}

如果我在initState()中使用Future做一些繁重的工作,则用户界面将被阻止。

1 个答案:

答案 0 :(得分:1)

Dart中的隔离是单线程的。隔离者一次只能做某事。

异步功能基本上是cooperative multitasking的一种形式。函数必须 yield (通常通过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);
});

然后,您应该发现UI可以定期处理事件,并且外观应该保持响应状态。 (请注意,由于额外的额外开销,您的计算将花费更长的时间。)