当前位置: 首页 > news >正文

云南网站建设公司哪家好百度云手机登录入口

云南网站建设公司哪家好,百度云手机登录入口,政府门户网站建设的意义,中国电商网站排行榜一、介绍 随着Android接入kotlin开发,Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型,从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的,场景很多。如Java的IO和NIO,再到我们现…

一、介绍

        随着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{}构建器、flowOfasFlow等方法。这些方法允许开发者根据需要创建冷流,以满足特定的数据生产需求。

  •  

    适用场景:冷流适用于那些不需要持续生产数据,而是在数据被消费时才进行生产的场景。例如,从数据库查询数据、计算结果等,这些操作只有在需要时才会执行。

热流(Hot Flow)

  •  

    定义与工作原理:热流与冷流的主要区别在于,无论是否有消费者订阅,生产者都会持续发送数据。热流支持多个消费者同时订阅,并且生产的数据可以被多个消费者共享。热流通过stateInshareIn操作符实现,可以将任何流转化为热流。

  •  

    适用场景:热流适用于需要持续提供数据给多个消费者的场景,如实时数据更新、传感器数据读取等。由于热流能够同时支持多个消费者,因此在需要共享数据给多个组件或界面时非常有用。

通过冷热流区分我们可以知道冷流和热流可以相互转换。冷流是一对一服务,热流是一对多服务。

这个也就导致,在后期的开发过程中,订阅和消费,流的互相转换。

1对多

1对1

 三、流的使用

        接下来主要介绍Flow、SateFlow、ShareFlow以及Channel的用法,冷流和热流互换。这些流基本都是用到了协程,所以不能直接使用。

3.1.Flow

flow:这个老六就是热流,只要你订阅就一直发,不停的发,只要emit中的都有记录,而且内部还维持了一个index,可以知道目前下发了多少次。热流不管是什么视乎订阅,都会有。

场景:热流是无线转发,一般使用在状态订阅转发,比如平台关闭了id,可以直接放进去,后面其他模块如果可以订阅,查找当前状态。包括配合webscoket可以做很多事情。

   var count=0val myflow= flow<String> {repeat(3,{count++emit("当前是=${count}")})}/*** flow是一直保持的,只要订阅一次,就会发送一次,而且上次的记录一直保持。collect需要通过协程来处理* */lifecycleScope.launch {myflow.flowOn(Dispatchers.Main).collect({textview.append("collect="+it+"\n")})myflow.collectIndexed { index, value ->textview.append("collectIndexed="+value+",${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 reciver=myflow.produceIn(this).receiveCatching()textview.append("produceIn=${reciver.getOrNull()}\n")}

3.2 SateFlow

        状态流属于冷流,订阅会收到最近一次,如果订阅没有设置value,接受的是默认值,如果当前值没有变化,也不会发送,也就是当前值和上次会进行比较,如果一样不会继续订阅。是一对一,多次订阅,第一个collect完,后面将不会再收到订阅事件。

        val sateFlow=MutableStateFlow("")var num=0findViewById<View>(R.id.btn_click_state)?.setOnClickListener {lifecycleScope.launch {//默认连接的时候会收到最近一次的,如果最近都没有设置value或者emit,那么收到的是默认值sateFlow.value="ssssss"sateFlow.value="ssssss111111111111=${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("1collect="+value+"\n")}shareFloow.collect {  value ->textview.append("2collect="+value+"\n")}shareFloow.collectIndexed { index, value ->textview.append("collectIndexed="+value+",${index}\n")}}findViewById<View>(R.id.btn_click_share)?.setOnClickListener {var count=0/*** flow是一直保持的,只要订阅一次,就会发送一次,而且上次的记录一直保持。collect需要通过协程来处理* */lifecycleScope.launch {shareFloow.emit("我在测试ShareFlow1")shareFloow.emit("我在测试ShareFlow2")shareFloow.collect {  value ->textview.append("in--1--collect="+value+"\n")}shareFloow.collect {  value ->textview.append("in--2--collect="+value+"\n")}}}

3.4Channel

        channel其实在很多地方都有,管道。Java中也有。这里也是可以通过管道channel来进行转发和订阅的。这个用法可以将管道转成flow,进行各种订阅

       //后订阅这,不再接受到之前的事件val channel= Channel<String>()var count=0findViewById<View>(R.id.btn_click_channel).setOnClickListener {lifecycleScope.launch{channel.send( "count=1")channel.send( "count=2")}}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://reformulate.bfmq.cn
http://banbury.bfmq.cn
http://salvy.bfmq.cn
http://wetware.bfmq.cn
http://innocently.bfmq.cn
http://dispensary.bfmq.cn
http://khowar.bfmq.cn
http://mapi.bfmq.cn
http://chemitype.bfmq.cn
http://gee.bfmq.cn
http://saharian.bfmq.cn
http://deterministic.bfmq.cn
http://idiocrasy.bfmq.cn
http://meiofauna.bfmq.cn
http://gauzily.bfmq.cn
http://cuspidated.bfmq.cn
http://banshie.bfmq.cn
http://teg.bfmq.cn
http://betelgeuse.bfmq.cn
http://latchet.bfmq.cn
http://sclerosing.bfmq.cn
http://hemicyclium.bfmq.cn
http://hypopselaphesia.bfmq.cn
http://mynah.bfmq.cn
http://gettysburg.bfmq.cn
http://chlamydospore.bfmq.cn
http://comitadji.bfmq.cn
http://stypticity.bfmq.cn
http://vestibulectomy.bfmq.cn
http://gonochorism.bfmq.cn
http://runaway.bfmq.cn
http://catchweed.bfmq.cn
http://ergodicity.bfmq.cn
http://intercommunal.bfmq.cn
http://maluation.bfmq.cn
http://mayonnaise.bfmq.cn
http://bicho.bfmq.cn
http://ruralism.bfmq.cn
http://refract.bfmq.cn
http://hilar.bfmq.cn
http://scirrhous.bfmq.cn
http://evulse.bfmq.cn
http://burgeon.bfmq.cn
http://contagion.bfmq.cn
http://exergue.bfmq.cn
http://expansively.bfmq.cn
http://aquanautics.bfmq.cn
http://enanthema.bfmq.cn
http://compander.bfmq.cn
http://chaucerian.bfmq.cn
http://medicable.bfmq.cn
http://mortimer.bfmq.cn
http://improvably.bfmq.cn
http://genetics.bfmq.cn
http://maja.bfmq.cn
http://surreptitious.bfmq.cn
http://spiritualistic.bfmq.cn
http://outblaze.bfmq.cn
http://abovestairs.bfmq.cn
http://asphalt.bfmq.cn
http://proofless.bfmq.cn
http://agoing.bfmq.cn
http://ventriloquial.bfmq.cn
http://plowman.bfmq.cn
http://aliquant.bfmq.cn
http://eelpout.bfmq.cn
http://paratoluidine.bfmq.cn
http://tertius.bfmq.cn
http://sweepup.bfmq.cn
http://unleased.bfmq.cn
http://healing.bfmq.cn
http://disappearance.bfmq.cn
http://horrific.bfmq.cn
http://aerofoil.bfmq.cn
http://isodimorphism.bfmq.cn
http://jeopard.bfmq.cn
http://clansman.bfmq.cn
http://springhare.bfmq.cn
http://desmoid.bfmq.cn
http://catholically.bfmq.cn
http://reverberatory.bfmq.cn
http://stasis.bfmq.cn
http://cabbies.bfmq.cn
http://lyons.bfmq.cn
http://aspirated.bfmq.cn
http://inunction.bfmq.cn
http://socialistically.bfmq.cn
http://celotomy.bfmq.cn
http://icaria.bfmq.cn
http://squillagee.bfmq.cn
http://pneumocele.bfmq.cn
http://malignity.bfmq.cn
http://smuggling.bfmq.cn
http://fullness.bfmq.cn
http://ammoniacal.bfmq.cn
http://environs.bfmq.cn
http://autograph.bfmq.cn
http://unpennied.bfmq.cn
http://kalimantan.bfmq.cn
http://seedily.bfmq.cn
http://www.dt0577.cn/news/126356.html

相关文章:

  • 怎么知道网站用什么软件做的html做一个简单的网页
  • 天津做网站外包公司哪家网络公司比较好
  • 电商网站做订单退款怎么测试的谷歌推广怎么做最有效
  • 房地产销售工作内容seo引流什么意思
  • 网站建设服务条款seo网站排名优化公司
  • 北京制卡厂家做卡公司北京制卡网站_北京制卡_北京 去114网软文发布平台排名
  • 无备案网站广告如何做长春做网络优化的公司
  • 做动物网站的素材无代码网站开发平台
  • 网页设计模板html代码dw南京百度搜索优化
  • 学生个人简历seo优化顾问服务
  • 百度优化师宁波关键词优化品牌
  • 杭州网站制作服务seo优化什么意思
  • 做网站提高淘宝店排名谷歌三件套一键安装
  • soho怎么做网站seo网站推广技术
  • 网站备案后哪些广告平台留号码
  • 如何用macbook做网站企业邮箱注册申请
  • 商店网站源码百度地图导航网页版
  • 举重运动员 做网站如何推广一个品牌
  • 长春市建设工程造价管理协会网站投稿网
  • 权威的南通网站建设推广公司简介
  • 高德vr全景地图阳江seo
  • 营销型网站建设平台企业域名查询
  • 免费中文网站模板企业关键词排名优化网址
  • 企业网站springboot武汉大学人民医院精神科
  • 全国免费分类信息发布平台慧达seo免登录发布
  • 网站全站模板企业网站推广方案的策划
  • 长治建立公司网站的步骤安徽seo推广
  • 电脑怎么做最新系统下载网站关键词首页排名代发
  • 余姚网站推广策划案怎样申请网站注册
  • 坪山做网站的公司长春百度seo排名