协程是Android采用的实现并发的一种方式,对于用户来说它可以理解为一个特殊的代码块,它使用看起来是串行的编程方式,实现程序并行,你不再需要考虑底层的线程、回调等东西,框架来帮你解决。
你需要记住的仅仅是,协程内的代码块是串行执行的(当然,又嵌套了子协程除外)。协程与它的调用者是并行进行的(所谓的不阻塞调用者)。当然,你也可以强制阻塞调用者,方法是在协程外部的语句中强制使用该协程的await函数。
协程有一个所属作用域范围(scope),它只在该范围有效时运行,范围没了,即使协程还在运行,也要杀死。一般有三种范围(GlobalScope、lifecycleScope、viewModelScope),GlobalScope作用域是app级的,app不死该范围不死、里面的协程也就不死。lifecycleScope是有生存期概念的对象所在作用域,比如activity、fregment,他们都具备lifecycleScope的特性,协程可以在这些作用域中运行。还有viewModelScope,它是后台viewModel对象自带的作用域。Android为了防止内存泄漏,引入了作用域,所有的变量和程序,都依附于特定的作用域,协程也不例外。另外,还有一个特定的调用协程的关键词runBlocking,它调用的协程会阻塞调用者,也就是说其实就是和调用者完全串行进行了,不再是协程了。
还有,用户可以指定协程在哪类线程上执行。线程分为三类:Default、Main、IO。Main类线程用于操作主界面,IO类线程用于访问磁盘、网络等操作。同一个协程,用户可以动态指定在不同线程上运行,比如在IO线程上访问网络,获得一个字符串,然后切换到Main线程,显示在界面中。
总之,协程只是特殊的代码块,块内串行、块间并行。协程依附于特定的作用域。协程可以动态调度到不同线程上执行。