ARTS - 2020.10.12 ~ 2020.10.18

ARTS打卡 - 16

1. Algorithm

24. Swap Nodes in Pairs

一道关于链表的题,交换链表相邻的节点。

这道题比较简单,遍历链表并且交换节点并且拼接在新的链表头节点后面就可以了。例如原始链表为: node1 -> node2 -> node3, 新链表头节点为:newHead,那么交换节点如下:

1
2
3
4
5
6
7
// 先将原始链表的下一个节点连接到新头节点
newHead.next = node2;
// 将node2的next赋值给node1的next
node1.next = node2.next;
// 新链表的下一个节点为node1
newHead = newHead.next;
newHead.next = node1;

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 交换链表中相邻的节点
public static ListNode swapPairs(ListNode head) {
ListNode newHead = new ListNode(0);
ListNode temp = newHead;
ListNode cur = head;
while (cur != null) {
if (cur.next == null) {
temp.next = cur;
break;
}
temp.next = cur.next;
cur.next = cur.next.next;
temp = temp.next;
temp.next = cur;
temp = temp.next;
cur = cur.next;
}
return newHead;
}

2. Review

R8 Shrinking in Android

  1. 为什么要使用R8压缩
    app代码内有很多的无用代码,即使不用任何第三方库也是一样。
    R8可以移除无用代码,R8收缩不仅可以优化未使用的代码,还可以使用不同的方法来优化大小,即使实际使用的代码也是如此
  • Tree shaking
    Tree shaking之前应该是前端的概念,用来去除js无用代码,在R8内使用也一样,用来去除无用代码,未实例化的类型。
  • Optimization
    R8还会优化代码带下,清除永远不会执行的代码,选择性内联,未使用参数删除以及类的合并。更简短的重命名。
1
2
3
4
5
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}

可以通过minifyEnabled为true来开启R8,并且在proguard内声明忽略规则。其中:

  • proguard-android.txt:为R8默认的规则
  • proguard-rules.pro: 为我们可以自定义的规则。
    此外还可以通过shrinkResources为true压缩资源文件。

3. Tip

  • 测试Activity生命周期,需要注意的是:用这种方法调用Activity的生命周期需要按照生命周期的顺序来调用,例如,如果在非stop的生命周期调用onRestart,并不会生效:
1
2
3
4
5
6
7
8
9
var controller: ActivityController<TestActivity> = Robolectric.buildActivity(TestActivity::class.java).create()
val activity = controller.get()
activity.lifecycle.addObserver(testObserver)

// test
controller.start()
verify{
testObserver.start()
}
  • 如果要测试监听了LifeCycle生命周期的方法,可以用如下方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
TestLifeCycle {

lateinit var lifecycleOwner: LifecycleOwner
lateinit var lifecycleRegistry: LifecycleRegistry

@Mock
private lateinit var lifecycleOwnerStub: LifecycleOwner

@Before
fun initMocks() {
MockitoAnnotations.initMocks(this)
lifecycleRegistry = LifecycleRegistry(lifecycleOwnerStub)
lifecycleOwner = LifecycleOwner { lifecycleRegistry }
lifecycleRegistry.addObserver(observer)
}

@Test
fun testStart() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
verify {
observer.onStart()
}
}
}

4. Share