【白水日记】Coroutines
在kotlin中,协程是方便而优雅处理长时间运行任务的方案
kotlin协程使得原来基于回调的代码改为了顺序编写,按照顺序编写的代码更容易阅读,协程和回调可以实现同样的功能,等待完成,直到运行有结果了,然后继续执行
协程的属性:异步,非阻塞,使用挂起函数使异步代码按照顺序执行
协程独立于程序的主要执行步骤运行,可以是并行的,也可以是另一个处理器上执行,当应用程序的其他部分在等待输入时,协程可以进行处理,异步的一个特性是,直到显式地等待,都不能期望结果是可用的
非阻塞意味着协程不会阻塞主线程,或UI线程,因此用户总能获得最流畅的体验
关键字suspend是kotlin中将函数标记为用于协程的方式,当协程调用一个标记为suspend的函数时,不会阻塞,直到函数像普通函数那样返回,协程会返回它停止的地方,并返回结果
当协程被挂起并等待结果时,它会解除正在运行它的线程的阻塞,其他函数或协程就可以运行了
suspend关键字并不需要指定运行代码的线程,可以是后台线程,也可以是主线程
阻塞和挂起之间的区别在于,一个线程被阻塞,就不会进行其他工作,挂起则会执行其他工作,直到得到结果
使用协程,主要有3个概念:job,dispatcher,scope
job:就是任何可以被取消的事务,每个协程都有一个job,可以取消该job来取消协程,job可以设置成父子层级,取消父job,会立即取消所有子job,相比较手动取消每个子job,方便得多
dispatcher:调度程序,发送协程在不同线程上运行,Dispatcher.Main在主线程运行,Dispatcher.IO将阻塞的I/O任务转移到共享线程池中
scope:作用域定义了协程运行的上下文,组合有关协程的job和dispatcher,追踪协程,当启动协程后,意味着在作用域中,指定了对应的协程
CoroutineScope:追踪所有的协程,帮助管理运行协程,取消协程
Architecture components:依赖ktx extensions的帮助,提供了ViewModelScope,LifecycleScope,liveData进行管理操作:
ViewModelScope:基于ViewModel类型进行定义,绑定的viewModel被清除,范围内的协程都会自动取消
LifecycleScope:配合Lifecycle对象使用,在此范围内启动的协程会在Lifecycle被销毁后取消,另外要注意,这些信息只会在Lifecycle范围内生效,不会随着activity重启而重启
LiveData和协程一起使用时,可以在liveData内部调用suspend函数,并将结果作为LiveData对象传递