40分钟快速入门Dart基础(下)
本章是对Dart 基础讲解的最后一章:我们讲解余下来的异步、泛型、异常,相对来说余下来的这三章稍微有点难度,但是小伙伴只要用心跟着我一起学习,应该问题不,如果有问题也可以在下方留言或者私信我。好废话不多说直接进入如主题:
Dart目录
一、前言:
对于已经叱咤开发武林已久的开发人员来讲,异步是一个很深的知识点。而我们在接触的每种语言里面基本上都会提到异步,同样地在使用Dart开发项目过程中,也是会有异步操作的。
我们在Java , oc中可以使用线程来实现异步操作,但是Dart是单线程模型,想要实现异步操作的话,我们可以使用事件队列来处理。
重点:Dart是单线程模型语言,也就没有了所谓的主线程/子线程之分。所以相对来说Dart线程理解起来和学习起来是相对容易的。
再这里首我们要想理解Dart单线程模型,首先我们理解什么是Even-Looper,Event-Queue
下面我们先来看一张图
从上图我们可以看出:Event Loop就是从EventQueue中获取Event、处理Event一直到EventQueue为空为止,而EventQueue小伙伴们可以看作成一个管道,Events 就是管道中每一个事件。可能说事件大家还是有点模糊那我们直接说是:用户的输入、文件IO、网络请求、按钮的点击这些都可以说成Event。
下面我们来说说单线程模型:
重点:只要Dart函数开始执行,它将会执行到这个函数结束,也就是说Dart的函数不会被其他Dart代码打断。
所以在Dart中引入一个关键词名叫:isolate 那什么叫:isolate 首先从字面上来看是”隔离“每个isolate都是隔离的,并不会共享内存。isolate是通过在通道上传递消息来通信,这就标识了Dart从性能上大大所有提升。不像其它语言(包括Java、Kotlin、Objective-C和Swift)都使用抢占式来切换线程。每个线程都被分配一个时间分片来执行,如果超过了分配的时间,线程将被上下文切换抢占。但是如果在线程间共享的资源(如内存)正在更新时发生抢占,则会导致竞态条件。
import 'dart:core';
import 'dart:isolate';
int i;
void main() {
i = 10;
//创建一个消息接收器
ReceivePort receivePort = new ReceivePort();
//创建isolate
Isolate.spawn(isolateMain, receivePort.sendPort);
//接收其他isolate发过来的消息
receivePort.listen((message) {
//发过来sendPort,则主isolate也可以向创建的isolate发送消息
if (message is SendPort) {
message.send("好呀好呀!");
} else {
print("接到子isolate消息:" + message);
}
});
}
/// 新isolate的入口函数
void isolateMain(SendPort sendPort) {
// isolate是内存隔离的,i的值是在主isolate定义的所以这里获得null
print(i);
ReceivePort receivePort = new ReceivePort();
sendPort.send(receivePort.sendPort);
// 向主isolate发送消息
sendPort.send("去大保健吗?");
receivePort.listen((message) {
print("接到主isolate消息:" + message);
});
}
复制代码
可以看到代码中,我们接收消息使用了listene函数来监听消息。假设我们现在在main方法最后加入sleep休眠,会不会影响listene回调的时机?
import 'dart:io';
import 'dart:isolate';
int i;
void main() {
i = 10;
//创建一个消息接收器
ReceivePort receivePort = new ReceivePort();
//创建isolate
Isolate.spawn(isolateMain, receivePort.sendPort);
//接收其他isolate发过来的消息
receivePort.listen((message) {
//发过来sendPort,则主isolate也可以向创建的isolate发送消息
if (message is SendPort) {
message.send("好呀好呀!");
} else {
print("接到子isolate消息:" &#