问题1: flutter网络请求探究-单线程模型请求网络时为什么不会导致卡顿
我们查看Dio源码,发现使用Dio做网络请求,其实网络请求会交给HttpClient,由HttpClient的openUrl方法开启网络请求,而openUrl其实会调用到一个external方法,代码如下
//flutter/bin/cache/dart-sdk/lib/io/socket.dart
external static Future<ConnectionTask<Socket>> _startConnect(host, int port,
{sourceAddress, int sourcePort = 0});
对应的实现在:
//flutter/bin/cache/dart-sdk/lib/_internal/vm/bin/socket_patch.dart
@patch
static Future<ConnectionTask<Socket>> _startConnect(dynamic host, int port,
{dynamic sourceAddress, int sourcePort = 0}) {
return RawSocket.startConnect(host, port,
sourceAddress: sourceAddress, sourcePort: sourcePort)
.then((rawTask) {
Future<Socket> socket =
rawTask.socket.then((rawSocket) => new _Socket(rawSocket));
return new ConnectionTask<Socket>._(socket, rawTask._onCancel);
});
}
继续点 就到了这里:
nativeCreateUnixDomainConnect也是一个external方法,但是没有找到它的实现,
看注释的意思是_NativeSocket封装了一个操作系统的socket,os是操作系统
或者说调用socket.nativeCreateUnixDomainConnect方法的时候会到调用操作系统的socket,也就是说网络请求其实是操作系统完成的,这就是为什么flutter应用是单线程模型的应用,但是在root isolate里做网络请求却不会卡 UI 的原因,猜测网络请求应该不是dart层完成的,是操作系统完成的;