A
判断是否”自成镜像“,基于根节点对称。
思路:基于的思路是:如果一棵树是对称的,那么每一层都应该是对称的。便可以借鉴树的层次遍历(广度遍历),对每一层判断该层的所有元素是对称的。题目有个提示:用递归和迭代解决,但是递归的方法没成功。
提交:Kotlin中耗时击败46.55%用户,内存竟然击败 100%的用户;
优化:
1、迭代:复杂度差不多,主要是思路上的优化:借助一个队列就可以,把判断”每一层是对层的“的思想转换为判断“对称的两个节点的左右子节点对称”,加入队列时按照左右左右的顺序成对加入,弹出时成对弹出进行比较;这里的主要技巧在于从左右两边分别入队,再成对出队进行比较;
2、递归:传入 t1 t2 两棵子树,结束条件:t1 t2 均为 null 或有一个为 null,否则 t1和 t2的 value 相等,并递归 t1.right 和 t2.left 以及 t1.left 和 t2.right
R
Improve the UI Performance of Your Android App
从四个方向提高 UI 性能:
- Profile GPU rendering
- 竖向柱状图不同颜色表示了不同事件耗时,可以根据哪种颜色占比过大,来判定哪个事件过于耗时。比如蓝色表示 draw 事件、绿色表示 Measure 和 Layout,深绿色表示连续两帧之间执行的操作,如果深绿色过高,可能是因为 UI 线程处理了太多事务,可以考虑放到其他线程一部分;
- 具体可参见官网:Inspect GPU rendering speed and overdraw
- Systrace
- 有三种方式打开:直接在手机上打开(Android 9.0以上支持)、通过命令行、使用 Perfetto 命令行工具,无论哪种方式,都会生成 trace 文件,都可以使用 Perfetto UI 进行可视化展示
- 详情可参考文档:Overview of system tracing、Navigate a Systrace report
- Layout inspector
- 可以直接查看运行时界面上的布局状态
- 连上设备后,对于 Android Studio 3.1 以上的版本,直接在 Tools 中打开
- 视图中可以给出整个页面 View 树详情、选中某个 View 的详情等
- 详情可参见官方文档:Debug Your layout with Layout Inspector and Layout Validation
- Benefits of ConstraintLayout
- 由于在 Measure、Layout、Draw 三个阶段都会从 View 树的顶部遍历到底部,所以一种“平铺式”的布局大有好处;
- ConstraintLayout 还有Guideline、Barrier、Chains 等众多特性来帮助构建平铺式布局;
其他:尽量避免:shadow、unnecessary backgrounds、alpha rendering
T
1、gradle 依赖时 module 要不要加路径
假如,在项目根目录的 lib 文件夹下存在一个 module:test-module,那么其他项目依赖时该如何定义?implementation project(':test-module') 还是 implementation project(':lib:test-module')?
这个问题主要取决于 settings.gradle 的配置:
- 首先,settings.gradle 中配置的 module 的位置默认是以项目根目录为基准的,如上面示例,settings.gradle 应该这样配置 include ':lib:test-module',而如果只配置为 indlue ':test-module',虽然 gradle 编译不报错,但是 lib/test-module 模块并没有被编译。
- 其次,其他 module 中的配置依赖的 project 名称要与 settings.gradle 中 include 的名称完全一致,比如 include ':lib:test-module',那么所有依赖 test-module 的地方都要写成 ':lib:test-module',哪怕当前 module 和 test-module 在同一目录下。
- 最后,为了解决 module 所在目录比较深时,project name 会很长而造成不便的问题。可以通过设置module name 与物理路径的对应关系来解决,比如
include ':test-module'
project(':tutor-module').projectDir = new File('lib/test-module')如此一来,所有依赖 test-module 的地方写成 implementation project(':test-module') 即可
2、获取当前正在显示的 Fragment
上次的 ARTS 中讲到 Fragment,并做了通过 Activity 获取 Fragment 的小实验。有同事说有时 Activity 包含多个 Fragment(比如 通过 viewPage 实现切换),能不能只展示出当前显示在前台的 Fragment。
通过上次分析,确实没发现通过 Activity 获取到展示在前台 Fragment 的方法,想想也有点不科学,因为 Fragment 也可以相互嵌套,所谓“展示在前台”、用户能看到或者能交互的Fragment 不止一个。
后来发现项目中依赖的 UETool,在选中某个 View 之后,会给出 View 所在的 Fragment 名称,看上去类似于“只显示前台可见的 Fragment”,猜测 UETool 的做法应该不只是通过 Activity 获得的,而是结合选中的 View 一起判定的,然后看了下 UETool 的代码,果然如此(可参见 Util 类的 getCurrentFragment 方法):通过 Activity 获取到所有 Fragment,遍历 Fragment,判断选中的 View 是否隶属于在 Fragment 的根 View 下。
S
最近做了个 Android 录屏的调研,也把一个小的开源项目 ScreenRecorder 学习了一下:《ScreenRecorder 源码阅读》http://note.youdao.com/noteshare?id=2a2b3dba1318225790745107b28addad