合肥模板网站建设软件,网站开发支持多个币种,大气婚庆网站源码,crm公司一、介绍 随着Android接入kotlin开发#xff0c;Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型#xff0c;从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的#xff0c;场景很多。如Java的IO和NIO#xff0c;再到我们现…
一、介绍 随着Android接入kotlin开发Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的场景很多。如Java的IO和NIO再到我们现在使用的RxJava或者升级版的JxJava2。针对JxJava的流处理与转发机制。kotlin语言也自带了flow。 早MVVM流行的时候LiveData充当了数据的订阅与流转但是我们知道LiveData有一个问题当Dialog或者当前设置发生旋转会出现倒灌这种行为是因为订阅生命发生变化。
针对这些问题kotlin语言自带了flow流。 二、kotlin flow的介绍 flow其实与RxJava比较类似都是基于流在处理订阅的分发。这个flow也被最新的MVI模式所接受替换了MVVM中的LiveData。
flow又区分冷流和热流。
冷流Cold Flow 定义与工作原理冷流是一种异步数据流它按顺序发出值并正常或异常完成。冷流的特点是只有当数据被消费者订阅即调用collect方法后生产者才开始执行发送数据流的代码。这意味着如果没有消费者订阅生产者不会发送任何数据。冷流通常是一对一的关系即一个生产者对应一个消费者。 创建方式冷流可以通过多种方式创建包括使用flow{}构建器、flowOf、asFlow等方法。这些方法允许开发者根据需要创建冷流以满足特定的数据生产需求。 适用场景冷流适用于那些不需要持续生产数据而是在数据被消费时才进行生产的场景。例如从数据库查询数据、计算结果等这些操作只有在需要时才会执行。
热流Hot Flow 定义与工作原理热流与冷流的主要区别在于无论是否有消费者订阅生产者都会持续发送数据。热流支持多个消费者同时订阅并且生产的数据可以被多个消费者共享。热流通过stateIn和shareIn操作符实现可以将任何流转化为热流。 适用场景热流适用于需要持续提供数据给多个消费者的场景如实时数据更新、传感器数据读取等。由于热流能够同时支持多个消费者因此在需要共享数据给多个组件或界面时非常有用。 通过冷热流区分我们可以知道冷流和热流可以相互转换。冷流是一对一服务热流是一对多服务。
这个也就导致在后期的开发过程中订阅和消费流的互相转换。 1对多 1对1 三、流的使用 接下来主要介绍Flow、SateFlow、ShareFlow以及Channel的用法冷流和热流互换。这些流基本都是用到了协程所以不能直接使用。
3.1.Flow
flow这个老六就是热流只要你订阅就一直发不停的发只要emit中的都有记录而且内部还维持了一个index可以知道目前下发了多少次。热流不管是什么视乎订阅都会有。
场景热流是无线转发一般使用在状态订阅转发比如平台关闭了id可以直接放进去后面其他模块如果可以订阅查找当前状态。包括配合webscoket可以做很多事情。 var count0val myflow flowString {repeat(3,{countemit(当前是${count})})}/*** flow是一直保持的只要订阅一次就会发送一次而且上次的记录一直保持。collect需要通过协程来处理* */lifecycleScope.launch {myflow.flowOn(Dispatchers.Main).collect({textview.append(collectit\n)})myflow.collectIndexed { index, value -textview.append(collectIndexedvalue${index}\n)}myflow.flatMapConcat { it-flow {emit(map${it})}}.collect({textview.append(${it}\n)})myflow.flatMapMerge {flow { emit(flatMapMerge${it})emit(MapMerge最近)}}.collect({textview.append(${it}\n)})myflow.flatMapLatest {flow { emit(flatMapLatest${it})emit(flatMapLatest最近)}}.collect({textview.append(${it}\n)})//热流转冷val recivermyflow.produceIn(this).receiveCatching()textview.append(produceIn${reciver.getOrNull()}\n)}3.2 SateFlow 状态流属于冷流订阅会收到最近一次如果订阅没有设置value接受的是默认值如果当前值没有变化也不会发送也就是当前值和上次会进行比较如果一样不会继续订阅。是一对一多次订阅第一个collect完后面将不会再收到订阅事件。 val sateFlowMutableStateFlow()var num0findViewByIdView(R.id.btn_click_state)?.setOnClickListener {lifecycleScope.launch {//默认连接的时候会收到最近一次的如果最近都没有设置value或者emit那么收到的是默认值sateFlow.valuesssssssateFlow.valuessssss111111111111${num}}}lifecycleScope.launch {sateFlow.collectIndexed { index, value -textview.append(index${index},value${value}\n)}sateFlow.collect({textview.append(${it}\n)})sateFlow.emit(aaaa)} 3.3 ShareFlow shareflow和其他的flow不一样在构造的时候有三个参数第一个是replay重复多少次和缓存次数后面是缓存流类型内部也是可以多次订阅但是collectIndexed和collect类型只能出现一个。但是一个类型可以多次订阅
public fun T MutableSharedFlow(replay: Int 0,extraBufferCapacity: Int 0,onBufferOverflow: BufferOverflow BufferOverflow.SUSPEND
)
默认都为0所以不会重复多次发送这个就很好规避倒灌的问题。不会因为生命周期发生变化内部出现多次订阅和消费的情况。
share流也是要在协程里的emit协程体中在emit之前不能进行订阅(collect)否则会出现阻塞导致事件无法往下走后面的emit无法发出可以在多个协程体中进行订阅。
lifecycleScope.launch {//多次订阅也不会发送只会优先发给第一个订阅的人shareFloow.collect { value -textview.append(1collectvalue\n)}shareFloow.collect { value -textview.append(2collectvalue\n)}shareFloow.collectIndexed { index, value -textview.append(collectIndexedvalue${index}\n)}}findViewByIdView(R.id.btn_click_share)?.setOnClickListener {var count0/*** flow是一直保持的只要订阅一次就会发送一次而且上次的记录一直保持。collect需要通过协程来处理* */lifecycleScope.launch {shareFloow.emit(我在测试ShareFlow1)shareFloow.emit(我在测试ShareFlow2)shareFloow.collect { value -textview.append(in--1--collectvalue\n)}shareFloow.collect { value -textview.append(in--2--collectvalue\n)}}}3.4Channel channel其实在很多地方都有管道。Java中也有。这里也是可以通过管道channel来进行转发和订阅的。这个用法可以将管道转成flow进行各种订阅 //后订阅这不再接受到之前的事件val channel ChannelString()var count0findViewByIdView(R.id.btn_click_channel).setOnClickListener {lifecycleScope.launch{channel.send( count1)channel.send( count2)}}lifecycleScope.launch {//类似shareflow一直订阅一直
// channel.consumeEach {
// textview.append(consumeEach${it}\n)
// }//只能订阅一次且接受是第一次后面不再接受
// channel.consume {
// textview.append(consume${this.receive()}\n)
// }//只消费一次无法再继续接受只接受第一次发送的事件
// channel.consumeAsFlow().produceIn(this).consume{
// textview.append(consumeAsFlow22${receive()}\n)
// }//会一直接受和shareflow类似channel.consumeAsFlow().collect{textview.append(consumeAsFlow11${it}\n)}}
他的订阅类型很多
1.consumeEach一直订阅只要发送就会接受
2.consume单次消费订阅后只接受第一次后面再发送也不会接受
3.channel.consumeAsFlow()转成热流
4.channel.consumeAsFlow().collect:热流的用法 四、总结
通过上面的分析不管冷流还是热流以及管道都有自己的特性。
冷热流以及管道可以互相转换
也可以转成LiveData
所以大家在用的时候要注意如果需要注意倒灌可以优先考虑ShareFlow需要长期订阅用flow
注意
但是sateFlow会出现倒灌情况和LiveData一样如何规避其实可以用ShareFlow替代
文章转载自: http://www.morning.rpdmj.cn.gov.cn.rpdmj.cn http://www.morning.prfrb.cn.gov.cn.prfrb.cn http://www.morning.hqykb.cn.gov.cn.hqykb.cn http://www.morning.nxzsd.cn.gov.cn.nxzsd.cn http://www.morning.jzklb.cn.gov.cn.jzklb.cn http://www.morning.rycbz.cn.gov.cn.rycbz.cn http://www.morning.fbccx.cn.gov.cn.fbccx.cn http://www.morning.ylph.cn.gov.cn.ylph.cn http://www.morning.gqtw.cn.gov.cn.gqtw.cn http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn http://www.morning.ttdxn.cn.gov.cn.ttdxn.cn http://www.morning.kgmkl.cn.gov.cn.kgmkl.cn http://www.morning.nrpp.cn.gov.cn.nrpp.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.hghhy.cn.gov.cn.hghhy.cn http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.iterlog.com.gov.cn.iterlog.com http://www.morning.qwqzk.cn.gov.cn.qwqzk.cn http://www.morning.gkjyg.cn.gov.cn.gkjyg.cn http://www.morning.bdqpl.cn.gov.cn.bdqpl.cn http://www.morning.jphxt.cn.gov.cn.jphxt.cn http://www.morning.sqfrg.cn.gov.cn.sqfrg.cn http://www.morning.fqpgf.cn.gov.cn.fqpgf.cn http://www.morning.bpmdg.cn.gov.cn.bpmdg.cn http://www.morning.lgtcg.cn.gov.cn.lgtcg.cn http://www.morning.mspkz.cn.gov.cn.mspkz.cn http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.rsdm.cn.gov.cn.rsdm.cn http://www.morning.mmosan.com.gov.cn.mmosan.com http://www.morning.zcncb.cn.gov.cn.zcncb.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.xdjsx.cn.gov.cn.xdjsx.cn http://www.morning.dnqpq.cn.gov.cn.dnqpq.cn http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.hgsmz.cn.gov.cn.hgsmz.cn http://www.morning.lfcnj.cn.gov.cn.lfcnj.cn http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.qgjp.cn.gov.cn.qgjp.cn http://www.morning.hrrmb.cn.gov.cn.hrrmb.cn http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn http://www.morning.tdmr.cn.gov.cn.tdmr.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.cpwmj.cn.gov.cn.cpwmj.cn http://www.morning.clybn.cn.gov.cn.clybn.cn http://www.morning.wdhhz.cn.gov.cn.wdhhz.cn http://www.morning.pmhln.cn.gov.cn.pmhln.cn http://www.morning.xmhpq.cn.gov.cn.xmhpq.cn http://www.morning.jcwhk.cn.gov.cn.jcwhk.cn http://www.morning.jycr.cn.gov.cn.jycr.cn http://www.morning.ltrz.cn.gov.cn.ltrz.cn http://www.morning.xfxlr.cn.gov.cn.xfxlr.cn http://www.morning.blznh.cn.gov.cn.blznh.cn http://www.morning.ppwdh.cn.gov.cn.ppwdh.cn http://www.morning.rrgqq.cn.gov.cn.rrgqq.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.fnfhs.cn.gov.cn.fnfhs.cn http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn http://www.morning.dqwykj.com.gov.cn.dqwykj.com http://www.morning.yixingshengya.com.gov.cn.yixingshengya.com http://www.morning.lmknf.cn.gov.cn.lmknf.cn http://www.morning.cwzzr.cn.gov.cn.cwzzr.cn http://www.morning.ndxss.cn.gov.cn.ndxss.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.qhrdx.cn.gov.cn.qhrdx.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.nspbj.cn.gov.cn.nspbj.cn http://www.morning.rycd.cn.gov.cn.rycd.cn http://www.morning.kmbgl.cn.gov.cn.kmbgl.cn http://www.morning.wwgpy.cn.gov.cn.wwgpy.cn http://www.morning.lyhrg.cn.gov.cn.lyhrg.cn http://www.morning.thxfn.cn.gov.cn.thxfn.cn http://www.morning.bqyb.cn.gov.cn.bqyb.cn http://www.morning.rtryr.cn.gov.cn.rtryr.cn http://www.morning.mgmyt.cn.gov.cn.mgmyt.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn