ARTS打卡 - 16
1. Algorithm
一道关于链表的题,交换链表相邻的节点。
这道题比较简单,遍历链表并且交换节点并且拼接在新的链表头节点后面就可以了。例如原始链表为: node1 -> node2 -> node3
, 新链表头节点为:newHead
,那么交换节点如下:
1 | // 先将原始链表的下一个节点连接到新头节点 |
代码如下:
1 | // 交换链表中相邻的节点 |
2. Review
- 为什么要使用R8压缩
app代码内有很多的无用代码,即使不用任何第三方库也是一样。
R8可以移除无用代码,R8收缩不仅可以优化未使用的代码,还可以使用不同的方法来优化大小,即使实际使用的代码也是如此
- Tree shaking
Tree shaking之前应该是前端的概念,用来去除js无用代码,在R8内使用也一样,用来去除无用代码,未实例化的类型。 - Optimization
R8还会优化代码带下,清除永远不会执行的代码,选择性内联,未使用参数删除以及类的合并。更简短的重命名。
1 | release { |
可以通过minifyEnabled为true来开启R8,并且在proguard内声明忽略规则。其中:
- proguard-android.txt:为R8默认的规则
- proguard-rules.pro: 为我们可以自定义的规则。
此外还可以通过shrinkResources为true压缩资源文件。
3. Tip
- 测试Activity生命周期,需要注意的是:用这种方法调用Activity的生命周期需要按照生命周期的顺序来调用,例如,如果在非stop的生命周期调用onRestart,并不会生效:
1 | var controller: ActivityController<TestActivity> = Robolectric.buildActivity(TestActivity::class.java).create() |
- 如果要测试监听了LifeCycle生命周期的方法,可以用如下方法:
1 | TestLifeCycle { |
4. Share
-
文章由一次camera引起的内存问题,延伸出分析、定位问题、解决问题的方法非常值得学习。