十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
到现在我入职也有一段时间了,这才有空梳理一下当时的面试题。简单说下我的情况:这是一次比较平常的跳槽,不是什么逆袭大厂的剧本,只是薪资有所涨幅。
为盐津等地区用户提供了全套网页设计制作服务,及盐津网站建设行业解决方案。主营业务为成都网站建设、网站制作、盐津网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
个人经历不详说,面试题对大家来说可能更有参考性,本篇先整理小米的面试题,我前后也面了很多个大厂,有空把其他几个大厂的面试题也总结一下。
Java基础肯定是少不了要问的,这轮面试Kotlin相对来说是我这些面试中问得比较多的,所以说准备面试还是要面面俱到。
我有点佩服我的记忆力了。这部分涉及到更多的 源码、原理和优化 方面的问题,Android高级开发需要具备一些什么能力大家也应该有所衡量了。
最后给大家分享一份 2246页 的 Android大厂高频面试题解析大全 ,基本上把我的面试内容都涵盖到了: Android、性能优化、Java、Kotlin、网络、插件化、热修复、模块化、组件化、增量更新、Gradle、图片、Flutter等。
这份资料免费提供给大家复习,文末查看领取方式,搞定Android面试这一份肯定够了。
第一章 Android相关 (源码分析、性能优化、Framework等)
第二章 性能优化 (GC原理、布局优化、绘制优化、内存优化等)
第三章 Java相关 (四种线程池、JVM、内存管理、垃圾回收、引用等)
第四章 Kotlin相关 (延迟初始化、Reified、Extension Functions、函数等)
第五章 网络相关 (HTTP 知识体系、HttpDns 原理、TCP,UDP,HTTP,SOCKET 之间的区别等)
第六章 插件化热修复模块化组件化增量更新Gradle
第七章 图片相关 (图片库对比、LRUCache原理、图片加载原理、Glide等)
第八章 Flutter相关 (Flutter原理、Flutter Hot Reload、Flutter 动态化 探索 、Flutter Platform Channel等)
需要这份资料的朋友私信我【面试题】就可以免费领取。
希望大家都可以把握住每一次自我提升的机会,把每一步都走踏实了,涨薪升职什么的都会迎你而来。
也欢迎大家和我一起交流Android方面的事情。
这两周面试遇到的算法题,都是需要手写实现,本人算法相当菜,面试之前也没刷题的概念,所以算法答的很不好,下面只简单说下都遇到了哪些吧。
该问题被问到过三次,应该是相当高频的吧,第一次我只想到了下面的第一种方法,面试官很nice,引导着我给出了第二种解决方案
1-2-3-4 交换之后为 2-1-4-3.(基本没有写出来,当时面试官问我你没刷题吗,我实话实话没刷过)
被问到过两次,第一次是某公司的技术负责人,人超级好,我第一中解法用的栈实现的,然后就问我时间复杂度和空间复杂度是多少,还耐心给我讲解这两个的概念和如何计算,然后又让我想第二种解法,第二种我写的是chartAt实现,面试官又问时间复杂度和空间复杂度是多少,然后让我再想更优的解法,最后在面试官的开导下写了下面第三种实现,特感谢这位面试官。
当时大体写出来了 但是临界值判断错了
当时是写出来了,但是方法很笨,之后去看了下源码,膜拜啊
就遇到了这五个算法,其中一个出现过三次,一个出现过两次,觉得自己还是挺幸运的吧。希望大家在找工作前多看看算法吧,这个是面试必问的,而且是手写实现,最近两天也在看算法,感觉大神们的想法真的太好了,自己是很难想到这些思路的。
页面中的各界面元素(Widget)以树的形式组织,即控件树。Flutter通过控件树中的每个控件创建不同类型的渲染对象,组成渲染对象树。而渲染对象树在Flutter的展示过程分为三个阶段:布局、绘制、合成和渲染。
(一)布局
Flutter采用深度优先机制遍历渲染对象树,决定渲染对象树中各渲染对象在屏幕上的位置和尺寸。在布局过程中,渲染对象树中的每个渲染对象都会接收父对象的布局约束参数,决定自己的大小,然后父对象按照控件逻辑决定各个子对象的位置,完成布局过程。
为了防止因子节点发生变化而导致整个控件树重新布局,Flutter加入了一个机制——布局边界(Relayout Boundary),可以在某些节点自动或手动地设置布局边界,当边界内的任何对象发生重新布局时,不会影响边界外的对象,反之亦然。
二)绘制
布局完成后,渲染对象树中的每个节点都有了明确的尺寸和位置。Flutter会把所有的渲染对象绘制到不同的图层上。与布局过程一样,绘制过程也是深度优先遍历,而且总是先绘制自身,再绘制子节点。
以下图为例:节点1在绘制完自身后,会再绘制节点2,然后绘制它的子节点3、4和5,最后绘制节点6。
可以看到,由于一些其他原因(比如,视图手动合并)导致2的子节点5与它的兄弟节点6处于了同一层,这样会导致当节点2需要重绘的时候,与其无关的节点6也会被重绘,带来性能损耗。
为了解决这一问题,Flutter提出了与布局边界对应的机制——重绘边界(Repaint Boundary)。在重绘边界内,Flutter会强制切换新的图层,这样就可以避免边界内外的互相影响,避免无关内容置于同一图层引起不必要的重绘。
重绘边界的一个典型场景是Scrollview。ScrollView滚动的时候需要刷新视图内容,从而触发内容重绘。而当滚动内容重绘时,一般情况下其他内容是不需要重绘的,这时候重绘边界就派上用场了。
(三)合成和渲染
终端设备的页面越来越复杂,因此Flutter的渲染树层级通常很多,直接交付给渲染引擎进行多图层渲染,可能会出现大量渲染内容的重复绘制,所以还需要先进行一次图层合成,即将所有的图层根据大小、层级、透明度等规则计算出最终的显示效果,将相同的图层归类合并,简化渲染树,提高渲染效率。
合并完成后,Flutter会将几何图层数据交由Skia引擎加工成二维图像数据,最终交由GPU进行渲染,完成界面的展示。
四、总结
咱们从各种业界主流跨端方案与Flutter的对比开始,到Flutter的简要介绍以及Flutter的运行机制,并以界面渲染过程为例,从布局、绘制、合成和渲染三个阶段讲述了Flutter的实现原理。相信大家对Flutter已经有一个整体认知,赶快一起上手操作起来吧!
针对日常不同的需求,我们时常需要自定义 Dialog ,而小菜在尝试过程中遇到一些小问题,简单记录总结一下;
小菜在自定义含有文本框的 Dialog 时,文本框获取焦点时,软键盘会部分遮挡对话框,但当小菜替换为 AlertDialog 时,文本框获取焦点时,对话框会向上浮动,避免软键盘遮挡;
对于含有文本框的自定义 Dialog ,小菜在最外层使用的是 Material 嵌套,小菜通过采用 Scaffold 来嵌套处理,默认 Scaffold 中 resizeToAvoidBottomPadding / resizeToAvoidBottomInset 为 true ,当设置为 false 时,文本框获取焦点时,依旧会被软键盘遮挡;因为在固定情景可以配合 resizeToAvoidBottomPadding 实现是否被软键盘遮挡效果;
resizeToAvoidBottomPadding 主要用于自身 Widget 是否避免被其他窗口遮挡;其中小菜查资料介绍在 Flutter 1.1.9 之后更推荐使用 resizeToAvoidBottomInset ;
小菜自定义一个可以多选 item 的 Dialog ,但 Dialog 中并没有状态更新的 State ,如何进行 Dialog 中状态更新呢?
小菜之前在 showDialog 时直接创建了 TypeListDialog ,此时是无状态的,当 WidgetBuilder 创建一个 StatefulBuilder 有状态的构造器即可,可以将 state 传递到 Dialog 中;
小菜在自定义 Dialog 时如何在一个回调方法中传递多个参数?
小菜在 Dialog 的回调方法中传递两个 List ,而在接收回调方法中匹配两个参数即可;小菜简单看作是一个函数方法;
小菜在重写 AppBar 时,如何取消默认的返回按钮?
取消 AppBar 前面的返回图标有多种方式;
自定义 Dialog 案例源码
小菜对于 Flutter 的应用还不够熟悉,很多常用的场景会处理的很不到位,小菜会对日常的小问题进行简单记录,逐步学习;如有错误,请多多指导!