我知道 Dart 是单线程的,flutter 也是,所以如果我做一些繁重的任务,它会阻塞 UI 事件队列,但是网络请求需要几秒钟而不阻塞 UI。
那么,为什么 Socket 不会阻塞 UI?困扰我的是为什么socket不会阻塞UI,但是繁重的任务会,虽然它们都是异步任务。
例如,此代码将阻止 UI
@override
void initState() {
super.initState();
Future((){
var result;
for (var i = 0; i < 1000000; ++i) {
result = 'result is $i';
}
print(result);
});
Run Code Online (Sandbox Code Playgroud)
此代码是正常的 HTTP 请求?它不会阻塞 UI
get() async {
var httpClient = new HttpClient();
var uri = new Uri.http(
'example.com', '/path1/path2', {'param1': '42', 'param2': 'foo'});
var request = await httpClient.getUrl(uri);
var response = await request.close();
var responseBody = await response.transform(UTF8.decoder).join();
}
Run Code Online (Sandbox Code Playgroud)
socket之所以不阻塞UI,是为了将请求过程拆分成多个部分?并将这些部分发送到当前的微任务队列?正如这个答案所说: