Kotlin
文章平均质量分 92
Integrated Machine
这个作者很懒,什么都没留下…
展开
-
Coroutine之Flow与LiveData相互转换
文章目录1. Flow与LiveData相互转换1.1. Flow转换成LiveData1.2. LiveData转换成Flow1. Flow与LiveData相互转换1.1. Flow转换成LiveDataFlow提供了asLiveData()扩展函数来将Flow转换成LiveData://CoroutineLiveData.kt@JvmOverloadsfun <T> Flow<T>.asLiveData( context: CoroutineContext原创 2020-09-29 17:10:07 · 3062 阅读 · 1 评论 -
Coroutine之Channel的多路复用原理浅析
目录1. select()函数细节2. send()函数细节根据官方文档可知select 表达式可以同时等待多个挂起函数,并选择第一个可用的。select具有一下功能可以细分如下:在多个Channel中选择第一个到达的进行处理;可以对主-从Channel模式进行分流处理,以降低主Channel的压力。下面通过官方的例子来分析Channel的多路复用原理,首先定义两个以不同速率产生字符串的生产者:fun CoroutineScope.fizz() = produce<String>原创 2020-09-20 23:51:59 · 722 阅读 · 0 评论 -
Coroutine之Channel与Flow的相互转换
目录1. Channel转化成Flow2. Flow转换程Channel2.1. produceIn()转换方式2.2. broadcastIn转换方式源码中对ChannelFlow的定义为:ChannelFlow是一个Flow,但是使用了Channel对它进行扩展,并且二者始终彼此融合在一起。ChannelFlow是一个虚类,其继承关系图为:ChannelFlow主要是用于Channel与Flow相互转换的,下面通过不同的转换方式来看其原理:1. Channel转化成Flow定义了两个Recei原创 2020-09-17 20:30:10 · 1974 阅读 · 0 评论 -
CoroutineContext的plus原理
文章目录CoroutineContext的plus operationfold展开操作minusKey减法操作get获取操作CoroutineContext的plus operationCoroutineContext中plus()方法会用到三个方法,这三个方法以虚函数的形式定义在CoroutineContext中: /** * Returns the element with the given [key] from this context or `null`. */原创 2020-08-18 15:07:40 · 1077 阅读 · 2 评论 -
Kotlin协程Channel中receive与send原理分析
文章目录0. 引言1. runBlocking()2. receive()3. send()0. 引言在Kotlin官方文档介绍中,Channel是用于协程间的通信的,它的宗旨是:Do not communicate by sharing memory; instead, share memory by communicating. 下面借助官方文档给的一个Channel的使用例子来感受一下这一通信过程的实现:private fun testChannel() { runBlocking {原创 2020-08-11 00:47:23 · 3274 阅读 · 0 评论 -
Kotlin中flow发射与接收分析
文章目录引言上游构造SafeFlow下游collect()逻辑引言Kotlin Coroutine 1.3.2 新增了flow库,通过官方描述:Flow — cold asynchronous stream with flow builder and comprehensive operator set (filter, map, etc). 可知Flow十分类似RxJava中的Obsaverble。下面通过简单例程来看一下它的使用:fun main() { runBlocking {原创 2020-08-05 16:21:54 · 1886 阅读 · 0 评论 -
Coroutine挂起与恢复分析
Coroutine挂起从编译代码看挂起从源码看挂起从编译代码看挂起用Kotlin简单写一个Coroutine的小例子,代码如下:@InternalCoroutinesApifun main() { println("main") runBlocking { println("main launch") test1() }}suspend fun test1() { println("test1") delay(100)原创 2020-07-28 17:53:03 · 1038 阅读 · 0 评论