kotlin协成(kotlin协程和线程的区别)
大家好!今天让创意岭的小编来大家介绍下关于kotlin协成的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端
创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解相关业务请拨打电话175-8598-2043,或添加微信:1454722008
本文目录:
一、kotlin之协程(七),协程中relay、yield 区别
kotlin之协程(一),线程,进程,协程,协程可以替换线程吗?
kotlin之协程(二),Kotlin协程是什么、挂起是什么、挂起的非阻塞式
kotlin之协程(三),开始创建协程,launch,withContext
kotlin之协程(四),协程的核心关键字suspend
kotlin之协程(五),launch 函数以及协程的取消与超时
kotlin之协程(六),协程中的 async和launch的区别以及runBlocking
kotlin之协程(七),协程中relay、yield 区别
relay 和 yield 方法是协程内部的操作,可以挂起协程,
我们只要使用 kotlin 提供的协程上下文类型,线程池是有多个线程的,再次执行的机会很快就会有的。
除了 main 类型,协程在挂起后都会封装成任务放到协程默认线程池的任务队列里去,有延迟时间的在时间过后会放到队列里去,没有延迟时间的直接放到队列里去
二、Kotlin-协程网络请求封装
真正的数据请求放在Repository(官方的方案还会有一层)
BaseResult可能是失败,也可能是成功,所以要对这两种情况做区分。这里转换规则是把BaseResult<T> 转换成ApiResult,ApiResult是密封类,只有两个子类一个是Success,一个是Error。
比如出现链接超时等非接口问题,kotlin中需要用异常捕获来处理。
可以将接口返回的data数据重新组装成想要的类,比如data+请求的参数。
viewmodel 调用
checkResult 主要对封装的数据判断,并通知UI更新。
三、Android Kotlin Coroutine(3):Job概述
在 Kotlin 中启动一个协程主要有 2 种方式:
一种是通过 launch 启动,一种是通过 async 启动,前者会返回一个 Job 类型的对象,后者会返回一个 Deferred 类型的对象。
Job 顾名思义就是“工作”的意思,每个协程可以想象成是一个工作任务,启动一个协程就是启动一个工作任务,来看看 Job 接口的主要定义:
从前面 Job 的接口定义中可以看到,它与线程 Thread 真的很相似,同样都有好几种不同的运行状态,下面通过几个简单的例子直观的感受一下:
执行结果为:
懒加载模式,协程还没启动,所以 isActive = false
执行结果为:
协程正常启动,所以isActive = true
执行结果为:
协程还没执行完毕,就被取消运行,所以 isCancelled = true
执行结果为:
协程已经执行完毕了,其 isCompleted 肯定为 true 了,再去调用 cancel() 方法,就没有任何影响了,所以 isCancelled = false。一件已经完成的任务,你再去取消它,是没有任何实际意义的了。
执行结果为:
协程还没有启动就取消,发现 isCompleted 与 isCancelled 都为 true,与前面几种情况对比一下,才能真正理解这几种状态的变化。
执行结果为:
协程非正常结束运行,相当于系统把它取消掉了,所以其 isCancelled 也为 true 。
在源码里可以看到以下状态图:
首先它也是一个 Job,所以它拥有 Job 的一切特性。其次,它能返回一个结果值,这点与 Java 里的 Future 类特别相似(如果你熟悉的话)。它比 Job 多了一个方法:
调用该方法时,它会等待该 Job 执行完并返回一个结果值。这是一个 suspend 方法,只能在协程内部调用,它会暂停协程的执行(当然它并不会阻塞线程),当 Job 执行完返回结果后,它又会恢复协程的执行。
一般在这种情况下,你可能会用到它:
从 Job 的接口定义中可以看到,Job 是可以有很多子 Job 的,如果一个 Job 与其他 Job 没有任何关联,那么它的完成及取消就很简单,不会影响到其他 Job 的执行。如果是有父子关系的 Job,那么他们的完成及取消则是会有相互关联关系的。
执行结果为:
执行结果为:
parentJob 被取消之后,childJob2 最后也被取消掉了。
四、kotlin协程的生命周期与jetpack组件绑定
安卓上, 协程可以帮忙解决两大问题:
管理长时间运行的任务, 这些任务可能阻塞主线程, 导致 UI 卡顿.
在主线程上安全地调用网络或磁盘操作.
安卓上使用协程的最好方式是使用官方的架构组件, 它们提供了对协程的支持. 目前 ViewModel, Lifecycle, LiveData , Room 组件提供了对协程一等的支持.
1、 ViewModel ViewModelScope
对 ViewModel 的支持主要是在 ViewModel 上提供了一个称为 ViewModelScope 的 CoroutineScope , 所有在 ViewModelScope 上启动的协程, 当 ViewModelScope 销毁时自动取消. 这样可以有效防止忘记取消任务时导致的资源泄漏.
其实 viewModelScope 的实现非常简单, 就是一个带有 Dispatchers.Main 的 SupervisorJob, 当 ViewModel.clear() 时, 在里面调用 Job.cancel() , 因为结构化并发的原因, 所有在 viewModelScope 范围内启动的协程, 都会级联取消.
2、Lifecycle LifecycleScope
每个具有生命周期的对象(Lifecycle)都有一个 LifecycleScope , 所有在它的范围内启动的协程, 当生命周期对象销毁时, 都会取消. 生命周期对象的 CoroutineScope 可以通过 lifecycle.coroutineScope 或者 lifecycleOwner.lifecycleScope 属性获取.
3、挂起生命周期相关的协程
在 Activity 或者 Fragment 中, 我们有时需要等到某个生命周期方法时, 或者至少在某个生命周期方法之后才执行某一任务, 如页面状态至少要 STARTED 才可以执行 FragmentTransaction , 对这种需求, 生命周期组件也提供了支持. Lifecycle 提供了 lifecycle.whenCreated, lifecycle.whenStarted, lifecycle.whenResumed 三个方法, 运行在这些方法内的协程, 如果页面的状态不是至少处于要求的最小状态, 协程将会挂起运行.
如果协程通过上面的whenXXX方法启动后, 处于活动状态, 还没有结束, 这时页面销毁了, 则协程会自动取消, 并且会走到下面的 finally 块中, 所在 finally 中, 需要检查页面所处的状态, 再决定做什么动作.
这里要注意: 如果页面 restart 重启了, 但协程并不会重启, 总之要确保信息是正确的.
4、LiveData 中使用协程
5、Room 对协程的支持
Room 从 v2.1 开始支持协程
JetPack知识点实战系列三:使用 Coroutines, Retrofit, Moshi实现网络数据请求
以上就是关于kotlin协成相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: