ARTS-6

157 阅读2分钟

A

104. Maximum Depth of Binary Tree

简单题目,最容易想到的、也是比较适合的方法就是递归的方式。

从小推到大,如果 root 是 null 的,高度当然为 0,如果左右子树都为 null,高度当然为 1,然后,高度就为左子树和右子树的高度的最大值 +1(根节点),所以关键还是递归的结束条件和推导公式:max(maxDepth(root.left), maxDepth(root.right))+1

R

Coroutines on Android (part I): Getting the background

Coroutines on Android (part II): Getting started

★★★☆☆

看了两篇文章,还是没看到核心的地方,基本还是在讲表面知识:

所有协程必须在调度程序中运行,调度程序知道如何恢复(resume)一个被挂起(suspend)的协程。常见的调度器有 Dispatchers.Main、Dispatchers.IO、Dispatchers.Default。

在 kotlin 中需要保证每个协程都是可追踪的,所以,所有协程也必须在 CoroutineScope 中运行,一个 scope 可以保持对 coroutines (所有用他启动的)的跟踪,用以在任何时机取消协程等。Scope 与 Dispatcher 不同,Scope 仅仅为了确保不会失去对协程的跟踪,而它并不真正执行协程。

在 MVVM 结构中,androidX 提供了 viewModelScrope 来更好的支持在 ViewModel 被销毁时自动的取消其启动的所有协程。

T

INVISIBLE & GONE:

当需要频繁改变一个控件的可见性时,invisible 和 gone 该如何选择?除了官方所说的“占位”(是否保留 layout 位置)的需求,另一个就要考虑性能上的差别,当设置 View 的可见性时,会进入 View 的 setFlags(int flags, int mask) 方法,可以看到:

        /* Check if the GONE bit has changed */
        if ((changed & GONE) != 0) {
            ......
            requestLayout();
            if (((mViewFlags & VISIBILITY_MASK) == GONE)) {
                ......
                destroyDrawingCache();
                if (mParent instanceof View) {
                    // GONE views noop invalidation, so invalidate the parent
                    ((View) mParent).invalidate(true);
                }
            }
        }

        /* Check if the VISIBLE bit has changed */
        if ((changed & INVISIBLE) != 0) {
           ......
        }

设置为 gone,会比 invisible 多出 1、请求重新布局;2、清除 draw 缓存;3、调用 parent 的 invalidate 几个过程,显然性能要比 invisible 差,因此,更推荐使用 invisible。

S

最近需求涉及到一些动画,又对动画做了简单的总结:《View 的位置参数与动画》