inline、noline、crossinline
- inline: 内联函数:编译时,会将函数体直接映射到函数调用处,内联函数适合高阶函数,对普通函数影响微不足道。因为高阶函数使用Lambda被替换成了匿名类,消耗性能
- noline: 使函数参数不被内联
- crossinline: 修饰inline函数参数的。当高阶函数被inline修饰时,调用内联函数时,可以直接return(全局返回)中断lambda表达式,此时用crossinline修饰内联函数的参数,可以禁止在Lambda表达式使用全局return返回 详解
协程原理
-
suspend本质是callBack ,kotlin里叫Continuation(续体)
-
Continuation:接下来需要执行的代码or剩下来的代码 suspend方法反编译会形成一个 带形参continution 的方法
public interface Continuation<in T> {
public val context: CoroutineContext
//相当于 onSuccess 结果
public fun resumeWith(result: Result<T>)
}
-
suspend方法返回值是个Any,标志函数有没有被挂起。(因为可能返回是枚举、"no suspend"、null所以定义为Any) testCor()方法内部会调用invokeSuspend()方法,invokeSuspend嵌套testCor()方法
-
内部维护有两个字段label(状态机,可理解为每一个supsend方法是一个case状态)result(协程返回值) 当执行一个伪supsend方法,会重新走一遍Switch切换到下一个状态机
-
他们公用同一个Continuation实例(轻量级)
-
协程完全由开发者管理,不涉及操作系统的调度和切换,因此高效
-
子线程往主线程切换依靠HandlerContext(子持有父协程体),而子线程切换依赖线程池