持续创作,加速成长!这是我参加「日新计划 10 月更文应战」的第3天,点击查看活动详情

以下首要针对往期录入的面试题进行一个分类归纳收拾,便利一致回忆和参考。本篇是第九集【完结篇】~

强调一下:别问了别问了, 面试文档要的在大众号<Android苦做舟>获取。

第一篇面试题在这: Android中高级进阶开发面试题冲刺合集(一)

第二篇在这: Android中高级进阶开发面试题冲刺合集(二)

第三篇在这: Android中高级进阶开发面试题冲刺合集(三)

第四篇在这: Android中高级进阶开发面试题冲刺合集(四)

第五篇在这: Android中高级进阶开发面试题冲刺合集(五)

第六篇在这: Android中高级进阶开发面试题冲刺合集(六)

第七篇在这: Android中高级进阶开发面试题冲刺合集(七)

第八篇在这:Android中高级进阶开发面试题冲刺合集(八)【Flutter篇】

Dart相关

1.Dart 傍边的 「..」表明什么意思?

参考答案:

“..” 和 “.” 不同:调用..后回来的适当所以this,而.回来的则是该办法回来的值;

2.Dart 的作用域是怎样样的?

参考答案:

Dart没有publicprivate等关键词,默许便是揭露的,私有变量运用下划线开始;

3.dart是多线程仍是单线程履行?

参考答案:

单线程履行,多线程是运用异步来履行的;

4.堵塞式调用和非堵塞式调用是怎样样的?

参考答案:

堵塞:调用成果之前,当时线程会被挂起,调用线程只要在得到成果之后才会持续履行;

非堵塞:调用履行之后,当时线程不会中止运转,只需求过一段时刻来查看有没有成果回来即可;

5.事情循环是什么?

参考答案:

将需求处理的一系列事情,放在一个事情行列(Event Queue)中,不断从事情行列中取出事情,并履行需求履行的代码块,直到事情被清空。

6.dart是值传递仍是引证传递?

参考答案:

dart是值传递。咱们每次调用函数,传递曩昔的都是目标的内存地址,而不是这个目标的仿制。

7.Dart 言语有哪些重要的特性?

参考答案:

  • Productive(生产力高,Dart的语法明晰明晰,东西简略但功能强大)
  • Fast(履行速度快,Dart供给提早优化编译,以在移动设备和Web上取得可预测的高功能和快速发动。)
  • Portable(易于移植,Dart可编译成ARM和X86代码,这样Dart移动运用程序能够在iOS、Android和其他地方运转)
  • Approachable(容易上手,充分吸收了高级言语特性,假如你现已知道C++,C言语,或许Java,你能够在短短几天内用Dart来开发)
  • Reactive(呼应式编程)

8.Dart 言语有哪些重要的概念?

参考答案:

  • 在Dart中,一切都是目标,一切的目标都是承继自Object
  • Dart是强类型言语,但能够用var或 dynamic来声明一个变量,Dart会主动推断其数据类型,dynamic相似c#
  • 没有赋初值的变量都会有默许值null
  • Dart支撑顶层办法,如main办法,能够在办法内部创立办法
  • Dart支撑顶层变量,也支撑类变量或目标变量
  • Dart没有public protected private等关键字,假如某个变量以下划线(_)开始,代表这个变量在库中是私有的

9.Dart线程模型是怎样履行的?

参考答案:

Dart 是单线程模型,运转的的流程如下图。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

Dart 在单线程中是以音讯循环机制来运转的,包含两个使命行列,一个是“微使命行列” microtask queue,另一个叫做“事情行列” event queue。 当Flutter运用发动后,音讯循环机制便发动了。首要会依照先进先出的次序逐个履行微使命行列中的使命,当一切微使命行列履行完后便开始履行事情行列中的使命,事情使命履行完毕后再去履行微使命,如此循环往复,生生不息。

10.Dart 是怎样完结多使命并行的?

参考答案:

Dart 是单线程的,不存在多线程,那怎样进行多使命并行的呢?其实,Dart的多线程和前端的多线程有许多的相似之处。Flutter的多线程首要依靠Dart的并发编程、异步和事情驱动机制。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

简略的说,在Dart中,一个Isolate目标其实便是一个isolate履行环境的引证,一般来说咱们都是经过当时的isolate去控制其他的isolate完结彼此之间的交互,而当咱们想要创立一个新的Isolate能够运用Isolate.spawn办法获取回来的一个新的isolate目标,两个isolate之间运用SendPort彼此发送音讯,而isolate中也存在了一个与之对应的ReceivePort承受音讯用来处理,可是咱们需求注意的是,ReceivePortSendPort在每个isolate都有一对,只要同一个isolate中的ReceivePort才干承受到当时类的SendPort发送的音讯而且处理。

11.await for 怎样运用?

参考答案:

await for是不断获取stream流中的数据,然后履行循环体中的操作。它一般用在直到stream什么时分完结,而且有必要等候传递完结之后才干运用,不然就会一向堵塞。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

12.Stream 有哪两种订阅形式?别离是怎样调用的?

参考答案:

单订阅(single)和多订阅(broadcast)。

单订阅便是只能有一个订阅者,而广播是能够有多个订阅者。这就有点相似于音讯服务(Message Service)的处理形式。单订阅相似于点对点,在订阅者出现之前会持有数据,在订阅者出现之后就才转交给它。而广播相似于发布订阅形式,能够一同有多个订阅者,当有数据时就会传递给一切的订阅者,而不管当时是否已有订阅者存在。

Stream 默许处于单订阅形式,所以同一个 stream 上的 listen 和其它大多数办法只能调用一次,调用第二次就会报错。但 Stream 能够经过 transform() 办法(回来另一个 Stream)进行接连调用。经过 Stream.asBroadcastStream() 能够将一个单订阅形式的 Stream 转化成一个多订阅形式的 StreamisBroadcast 属功能够判断当时 Stream 所在的形式。

13.dart中mixin机制是怎样样的?

参考答案:

mixin 是Dart 2.1 参加的特性,以前版别一般运用abstract class替代。简略来说,mixin是为了处理承继方面的问题而引进的机制,Dart为了支撑多重承继,引进了mixin关键字,它最大的特殊处在于:mixin界说的类不能有结构办法,这样能够避免承继多个类而发生的父类结构办法抵触。 mixins的目标是类,mixins绝不是承继,也不是接口,而是一种全新的特性,能够mixins多个类,mixins的运用需求满足一定条件。

14.JIT 与 AOT别离是什么?

参考答案:

借助于先进的东西链和编译器,Dart 是少数一同支撑 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运转前编译)的言语之一。那,到底什么是 JIT 和 AOT 呢?言语在运转之前一般都需求编译,JIT 和 AOT 则是最常见的两种编译形式。JIT 在运转时即时编译,在开发周期中运用,能够动态下发和履行代码,开发测验功率高,但运转速度和履行功能则会因为运转时即时编译受到影响。

AOT 即提早编译,能够生成被直接履行的二进制代码,运转速度快、履行功能表现好,但每次履行前都需求提早编译,开发测验功率低。

15.Dart的内存分配与废物收回是怎样样的?

参考答案:

Dart VM 的内存分配策略比较简略,创立目标时只需求在堆上移动指针,内存增加始终是线性的,省去了查找可用内存的进程。在 Dart 中,并发是经过 Isolate 完结的。Isolate 是相似于线程但不同享内存,独立运转的 worker。这样的机制,就能够让 Dart 完结无锁的快速分配。

Dart 的废物收回,则是选用了多生代算法。新生代在收回内存时选用“半空间”机制,触发废物收回时,Dart 会将当时半空间中的“活泼”目标拷贝到备用空间,然后全体开释当时空间的一切内存。收回进程中,Dart 只需求操作少数的“活泼”目标,没有引证的许多“死亡”目标则被疏忽,这样的收回机制很合适 Flutter 结构中许多 Widget 毁掉重建的场景。

16.运用mixins的条件是什么?

参考答案:

因为mixins运用的条件,随着Dart版别一向在变,这儿讲的是Dart2.1中运用mixins的条件:

  • mixins类只能承继自object mixins类不能有结构函数
  • 一个类能够mixins多个mixins
  • 能够mixins多个类,不破坏Flutter的单承继

17.mixin 怎样指定反常类型?

参考答案:

on关键字可用于指定反常类型。 on只能用于被mixins标记的类,例如mixins X on A,意思是要mixins X的话,得先接口完结或许承继A。这儿A能够是类,也能够是接口,可是在mixins的时分用法有差异.

on 一个类:

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

on 的是一个接口: 得首要完结这个接口,然后再用mix

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

18.main future mirotask 的履行次序是怎样的?

参考答案:

一般代码都是同步履行的,结束后会开始查看microtask中是否有使命,若有则履行,履行完持续查看microtask,直到microtask列队为空。终究会去履行event行列(future)。

19.Future和Isolate有什么差异?

参考答案:

future是异步编程,调用本身立即回来,并在稍后的某个时分履行完结时再取得回来成果。在一般代码中能够运用await 等候一个异步调用结束。 isolate是并发编程,Dart有并发时的同享状况,一切Dart代码都在isolate中运转,包含开始的main()。每个isolate都有它自己的堆内存,意味着其间一切内存数据,包含大局数据,都仅对该isolate可见,它们之间的通讯只能经过传递音讯的机制完结,音讯则经过端口(port)收发。isolate仅仅一个概念,详细取决于怎样完结,比方在Dart VM中一个isolate或许会是一个线程,在Web中或许会是一个Web Worker

20.Stream 与 Future是什么联系?

参考答案:

StreamFuture 是 Dart 异步处理的中心 API。Future 表明稍后取得的一个数据,一切异步的操作的回来值都用 Future 来表明。可是 Future 只能表明一次异步取得的数据。而 Stream 表明屡次异步取得的数据。比方界面上的按钮或许会被用户点击屡次,所以按钮上的点击事情(onClick)便是一个 Stream 。简略地说,Future将回来一个值,而Stream将回来屡次值。Dart 中一致运用 Stream 处理异步事情流。Stream 和一般的集合相似,都是一组数据,只不过一个是异步推送,一个是同步拉取。

Flutter

1.介绍下Flutter的FrameWork层和Engine层,以及它们的作用

参考答案:

Flutter的FrameWork层是用Dart编写的结构(SDK),它完结了一套根底库,包含Material(Android风格UI)和Cupertino(iOS风格)的UI界面,下面是通用的Widgets(组件),之后是一些动画、制作、烘托、手势库等。这个纯 Dart完结的 SDK被封装为了一个叫作 dart:ui的 Dart库。咱们在运用 Flutter写 App的时分,直接导入这个库即可运用组件等功能。 Flutter的Engine层是Skia 2D的绘图引擎库,其前身是一个向量绘图软件,Chrome和 Android均选用 Skia作为绘图引擎。Skia供给了十分友爱的 API,而且在图形转化、文字烘托、位图烘托方面都供给了友爱、高效的表现。Skia是跨渠道的,所以能够被嵌入到 Flutter的 iOS SDK中,而不用去研究 iOS闭源的 Core Graphics / Core Animation。Android自带了 Skia,所以 Flutter Android SDK要比 iOS SDK小许多。

2.介绍下Widget、State、Context 概念

参考答案:

  • Widget:在Flutter中,几乎一切东西都是Widget。将一个Widget想象为一个可视化的组件(或与运用可视化方面交互的组件),当你需求构建与布局直接或直接相关的任何内容时,你正在运用Widget
  • Widget树:Widget以树结构进行组织。包含其他Widgetwidget被称为父Widget(或widget容器)。包含在父widget中的widget被称为子Widget
  • Context:仅仅是已创立的一切Widget树结构中的某个Widget的方位引证。简而言之,将context作为widget树的一部分,其间context所对应的widget被添加到此树中。一个context只从属于一个widget,它和widget相同是链接在一同的,而且会形成一个context树。
  • State:界说了StatefulWidget实例的行为,它包含了用于”交互/干预“Widget信息的行为和布局。运用于State的任何更改都会强制重建Widget

3.介绍下StatelessWidget和StatefulWidget两种状况组件类

参考答案:

  • StatelessWidget: 一旦创立就不关心任何改变,在下次构建之前都不会改变。它们除了依靠于本身的装备信息(在父节点构建时供给)外不再依靠于任何其他信息。比方典型的TextRowColumnContainer等,都是StatelessWidget。它的生命周期适当简略:初始化、经过build()烘托。
  • StatefulWidget: 在生命周期内,该类Widget所持有的数据或许会发生改变,这样的数据被称为State,这些具有动态内部数据的Widget被称为StatefulWidget。比方复选框、Button等。State会与Context相相关,而且此相关是永久性的,State目标将永远不会改变其Context,即使能够在树结构周围移动,也仍将与该context相相关。当statecontext相关时,state被视为已挂载。StatefulWidget由两部分组成,在初始化时有必要要在createState()时初始化一个与之相关的State目标。

4.StatefulWidget 的生命周期是怎样样的?

参考答案:

Flutter的Widget分为StatelessWidgetStatefulWidget两种。其间,StatelessWidget是无状况的,StatefulWidget是有状况的,因此实际运用时,更多的是StatefulWidgetStatefulWidget的生命周期如下图:

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

  • initState()Widget 初始化当时 State,在当时办法中是不能获取到 Context 的,如想获取,能够试试 Future.delayed()
  • didChangeDependencies():在 initState() 后调用,State目标依靠联系发生改变的时分也会调用。
  • deactivate():当 State 被暂时从视图树中移除时会调用这个办法,页面切换时也会调用该办法,和Android里的 onPause 差不多。
  • dispose()Widget 毁掉时调用。 didUpdateWidgetWidget 状况发生改变的时分调用。

5.说下Widgets、RenderObjects 和 Elements的联系

参考答案:

首要看一下这几个目标的含义及作用。

  • Widget :仅用于存储烘托所需求的信息。
  • RenderObject :担任办理布局、制作等操作。
  • Element :才是这颗巨大的控件树上的实体。

Widget会被inflate(填充)Element,并由Element办理底层烘托树。Widget并不会直接办理状况及烘托,而是经过State这个目标来办理状况。Flutter创立Element的可见树,相对于Widget来说,是可变的,一般界面开发中,咱们不用直接操作Element,而是由结构层完结内部逻辑。就如一个UI视图树中,或许包含有多个TextWidget(Widget被运用屡次),可是放在内部视图树的视角,这些TextWidget都是填充到一个个独立的Element中。Element会持有renderObjectwidget的实例。记住,Widget 仅仅一个装备,RenderObject 担任办理布局、制作等操作。 在第一次创立 Widget 的时分,会对应创立一个 Element, 然后将该元素刺进树中。假如之后 Widget 发生了改变,则将其与旧的 Widget 进行比较,而且相应地更新 Element。重要的是,Element 不会被重建,仅仅更新而已。

6.Flutter 是怎样与原生Android、iOS进行通讯的?

参考答案:

Flutter 经过 PlatformChannel 与原生进行交互,其间 PlatformChannel 分为三种:

  • BasicMessageChannel:用于传递字符串和半结构化的信息。
  • MethodChannel:用于传递办法调用。Flutter主动调用Native的办法,并获取相应的回来值。
  • EventChannel:用于数据流(event streams)的通讯。

关于原理:www.jianshu.com/p/39575a90e…

7.简述下Flutter 的热重载

参考答案:

Flutter 的热重载是基于 JIT 编译形式的代码增量同步。因为 JIT 属于动态编译,能够将 Dart 代码编译成生成中间代码,让 Dart VM 在运转时解说履行,因此能够经过动态更新中间代码完结增量同步。

热重载的流程能够分为 5 步,包含:扫描工程改动、增量编译、推送更新、代码兼并、Widget 重建。

Flutter 在接收到代码改变后,并不会让 App 重新发动履行,而只会触发 Widget 树的重新制作,因此能够坚持改动前的状况,大大缩短了从代码修正到看到修正发生的改变之间所需求的时刻。

另一方面,因为涉及到状况的保存与康复,涉及状况兼容与状况初始化的场景,热重载是无法支撑的,如改动前后 Widget 状况无法兼容、大局变量与静态特点的更改、main 办法里的更改、initState 办法里的更改、枚举和泛型的更改等。

能够发现,热重载提高了调试 UI 的功率,十分合适写界面样式这样需求反复查看修正作用的场景。但因为其状况保存的机制所限,热重载本身也有一些无法支撑的边界。

8.说下Flutter 和其他跨渠道计划的本质差异

参考答案:

React Native 之类的结构,仅仅经过 JavaScript 虚拟机扩展调用体系组件,由 Android 和 iOS 体系进行组件的烘托;

Flutter 则是自己完结了组件烘托的闭环。那么,Flutter 是怎样完结组件烘托的呢?这需求从图画显现的根本原理说起。在核算机体系中,图画的显现需求 CPU、GPU 和显现器一同配合完结:CPU 担任图画数据核算,GPU 担任图画数据烘托,而显现器则担任终究图画显现。CPU 把核算好的、需求显现的内容交给 GPU,由 GPU 完结烘托后放入帧缓冲区,随后视频控制器依据垂直同步信号(VSync)以每秒 60 次的速度,从帧缓冲区读取帧数据交由显现器完结图画显现。操作体系在出现图画时遵循了这种机制,而 Flutter 作为跨渠道开发结构也选用了这种底层计划。下面有一张更为详尽的示意图来解说 Flutter 的制作原理。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

Flutter 制作原理能够看到,Flutter 关注怎样尽或许快地在两个硬件时钟的 VSync 信号之间核算并组成视图数据,然后经过 Skia 交给 GPU 烘托:UI 线程运用 Dart 来构建视图结构数据,这些数据会在 GPU 线程进行图层组成,随后交给 Skia 引擎加工成 GPU 数据,而这些数据会经过 OpenGL 终究供给给 GPU 烘托。

9.Widget 仅有标识Key有哪几种?

参考答案:

在flutter中,每个widget都是被仅有标识的。这个仅有标识在buildrendering阶段由结构界说。该标识对应于可选的Key参数,假如省掉,Flutter将会主动生成一个。

在flutter中,首要有4种类型的KeyGlobalKey(保证生成的Key在整个运用中仅有,是很贵重的,允许element在树周围移动或改变父节点而不会丢掉状况)、LocalKeyUniqueKeyObjectKey

10.什么是Navigator? MaterialApp做了什么?

参考答案:

Navigator是在Flutter中担任办理保护页面仓库的导航器。

MaterialApp在需求的时分,会主动为咱们创立Navigator

Navigator.of(context),会运用context来向上遍历Element树,找到MaterialApp供给的_NavigatorState再调用其push/pop办法完结导航操作。

11.Flutter动画类型有哪些?

参考答案:

  • 补间动画:给定初值与终值,体系主动补齐中间帧的动画

  • 物理动画:遵循物理学定律的动画,完结了弹簧、阻尼、重力三种物理作用

    在运用运用进程中常见动画形式:

    • 动画列表或许网格:例如元素的添加或许删去操作;
    • 转场动画Shared element transition:例如从当时页面打开另一页面的过渡动画;
    • 交错动画Staggered animations:比方部分或许彻底交错的动画。

12.怎样一致办理错误页面?

参考答案:

main办法修正ErrorWidget.builder 来自界说一个属于自己的Widget

如:

 /// 自界说报错页面
 ErrorWidget.builder = (FlutterErrorDetails flutterErrorDetails) {
  debugPrint(flutterErrorDetails.toString());
  return new Center(child: new Text("App错误,快去反馈给作者!"));
  };

13.Flutter 中存在哪四大线程?

参考答案:

Flutter 中存在四大线程,别离为 UI RunnerGPU RunnerIO RunnerPlatform Runner (原生主线程) ,一同在 Flutter 中能够经过 isolate 或许 compute 履行真实的跨线程异步操作。

14.PlatformView的作用有哪些?

参考答案:

Flutter 中经过 PlatformView 能够嵌套原生 ViewFlutter UI 中;

15.PlatformView运用了哪些东西来完结?

参考答案:

PresentationVirtualDisplaySurface 等;

16.PlatformView大致原理是怎样样的?

参考答案:

运用了相似副屏显现的技能,VirtualDisplay 类代表一个虚拟显现器,调用 DisplayManagercreateVirtualDisplay() 办法,将虚拟显现器的内容烘托在一个 Surface 控件上,然后将 Surfaceid告诉给 Dart,让 engine 制作时,在内存中找到对应的 Surface 画面内存数据,然后制作出来。 实时控件截图烘托显现技能。

17.Flutter 的 Debug 和 release 别离是在什么形式下运转的?

参考答案:

Flutter 的 Debug 下是 JIT 形式,release下是AOT形式。

18.Platform Channel有哪几种通讯办法?别离是用于什么操作?

参考答案:

  • BasicMessageChannel :用于传递字符串和半结构化的信息。
  • MethodChannel :用于传递办法调用(method invocation)。
  • EventChannel: 用于数据流(event streams)的通讯。

19.RenderObject布局相关办法调用次序是怎样样的?

参考答案:

layout -> performResize -> performLayout -> markNeedsPaint , 可是用户一般不会直接调用 layout,而是经过 markNeedsLayout ,详细流程如下:

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

20.RenderObject怎样使得页面重绘?流程是怎样样的?

参考答案:

RenderObjectattch/layout 之后会经过 markNeedsPaint(); 使得页面重绘,流程大概如下:

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

经过isRepaintBoundary 往上确认了更新区域,经过 requestVisualUpdate 办法触发更新往下制作。

21.Flutter存在哪几棵树?他们有什么联系?

参考答案:

Flutter 中存在 WidgetElementRenderObjectLayer 四棵树,其间 WidgetElement 是一对多的联系

22.简述下Flutter的线程办理模型

参考答案:

默许情况下,Flutter Engine层会创立一个Isolate,而且Dart代码默许就运转在这个主Isolate上。必要时能够运用spawnUrispawn两种办法来创立新的Isolate,在Flutter中,新创立的Isolate由Flutter进行一致的办理。 事实上,Flutter Engine自己不创立和办理线程,Flutter Engine线程的创立和办理是Embeder担任的,Embeder指的是将引擎移植到渠道的中间层代码,Flutter Engine层的架构示意图如下图所示。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

在Flutter的架构中,Embeder供给四个Task Runner,别离是Platform Task RunnerUI Task Runner ThreadGPU Task RunnerIO Task Runner,每个Task Runner担任不同的使命,Flutter Engine不在乎Task Runner运转在哪个线程,可是它需求线程在整个生命周期里边坚持安稳。

状况办理

1.状况办理是什么?

参考答案:

程序=算法+数据结构 数据是程序的中心。数据结构和算法两个概念间的逻辑联系贯穿了整个程序国际,首要二者表现为不可分割的联系。其实Flutter不便是一个程序吗,那咱们面对的最底层的问题仍是算法和数据结构,所以咱们推导出

Flutter=算法+数据结构 那状况办理是什么?我也用公式来表达一下,如下:

Flutter状况办理=算法+数据结构+UI绑定

2.为什么需求状况办理?

参考答案:

用于处理状况更新问题,不需求WidgetState 被大局化,保证组件隐私,使得代码可扩展,易保护,能够动态替换UI而不影响算法逻辑,安全可靠,坚持数据的安稳伸缩,功能佳,部分优化;

3.说下状况办理根本分类

参考答案:

分为部分办理和大局办理;

  • 部分办理:时刻短的状况,这种状况根本不需求做大局处理;
  • 大局办理:即运用状况,非时刻短状况,您要在运用程序的许多部分之间同享,以及希望在用户会话之间坚持的状况,便是咱们所说的运用程序状况(有时也称为同享状况)

4.状况办理的底层逻辑一般是怎样样的?

参考答案:

  • State:如StatefulWidgetStreamBuilder状况办理办法;
  • InheritedWidget专门担任Widget树中数据同享的功能型Widget:如Providerscoped_model便是基于它开发;
  • Notification:与InheritedWidget正好相反,InheritedWidget是从上往下传递数据,Notification是从下往上,但两者都在自己的Widget树中传递,无法跨过树传递;
  • Stream 数据流 :如Blocflutter_reduxfish_redux等也都基于它来做完结;

5.状况办理的运用原则是怎样样的?

参考答案:

部分办理优于大局、坚持数据安全性、考虑页面重新build带来的影响;

6.运用成熟状况办理库的坏处有哪些?

参考答案:

增加代码复杂性、结构bug修复需求时刻等候、不理解结构原理导致运用办法不对,反而带来更多问题、选型错误导致不符合运用要求、与团队风格抵触不适用;

进阶

1.flutter run实际走了哪三个命令?别离用于什么操作?

参考答案:

  • flutter build apk:经过gradle来构建APK
  • adb install:装置APK
  • adb am start:发动运用

2.setState做了哪些作业?是怎样更新UI的?

参考答案:

setState 其实是调用了 markNeedsBuild ,该办法内部标记此ElementDirty ,然后在下一帧 WidgetsBinding.drawFrame 才会被制作, setState并不是立即生效的。

3.Flutter运用发动runApp(MyApp)进程是怎样样的?

参考答案:

Flutter 中 runApp 发动入口其实是一个 WidgetsFlutterBinding ,它首要是经过 BindingBase 的子类 GestureBindingServicesBindingSchedulerBindingPaintingBindingSemanticsBindingRendererBindingWidgetsBinding 等,经过 mixins 的组合而成的。

4.Dart虚拟机怎样办理的?怎样调用?怎样跟Flutter引擎交互?

参考答案:

Dart虚拟机具有自己的Isolate,彻底由虚拟机自己办理的,Flutter引擎也无法直接访问。Dart的UI相关操作,是由Root Isolate经过Dart的C++调用,或许是发送音讯告诉的办法,将UI烘托相关的使命提交到UIRunner履行,这样就能够跟Flutter引擎相关模块进行交互。

5.Isolate组成部分有哪些?别离有什么作用?

参考答案:

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

  • isolate堆是运该isolate中代码分配的一切目标的GC办理的内存存储;
  • vm isolate是一个伪isolate,里边包含不可变目标,比方nulltruefalse
  • isolate堆能引证vm isolate堆中的目标,但vm isolate不能引证isolate堆;
  • isolate彼此之间不能彼此引证 每个isolate都有一个履行dart代码的Mutator thread,一个处理虚拟机内部使命(比方GC, JIT等)的helper thread

6.线程和isolate的联系是什么?

参考答案:

1、同一个线程在同一时刻只能进入一个isolate,当需求进入另一个isolate则有必要先退出当时的isolate

2、一次只能有一个Mutator线程相关对应的isolateMutator线程是履行Dart代码并运用虚拟机的公共的C言语API的线程;

7.介绍下JIT运转形式中kernel service

参考答案:

是一个辅助类isolate,其中心作业便是CFE,将dart转为Kernel二进制,然后VM可直接运用Kernel二进制运转在主isolate里边运转。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】

8.setState在哪种场景下或许会失效?

参考答案:

1、改写办法内声明的变量;

2、改写被final修饰的变量;

9.isolate是怎样进行通讯的?实例化进程是怎样样的?

参考答案:

isolate线程之间的通讯首要经过port来进行,这个port音讯传递进程是异步的。

实例化一个isolate的进程包含:

  • 1.实例化isolate结构体。
  • 2.在堆中分配线程内存。
  • 3.装备port等进程。

10.虚拟机怎样运转Dart代码?

参考答案:

1.源码或许Kernel二进制(JIT)

2.snapshot :

  • AOT snapshot
  • AppJIT snapshot

11.JIT运转形式中debug运转原理是怎样样的?

参考答案:

将dart代码转化为kernel二进制和履行kernel二进制,这两个进程也能够分离开来,在两个不同的机器履行,比方host机器履行编译,移动设备履行kernel文件。

Android中高级进阶开发面试题冲刺合集(九)【完结篇】