【白水日记】Coroutines

2021-02-23  本文已影响0人  d2665f7588cb

    在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对象传递

上一篇下一篇

猜你喜欢

热点阅读