android mvi开发模式,Android MVI 设计模式(3)

我们用 kotlin 的 sealed 类密封一些数据类,kotlin 提供的密封类类似于枚举,密封类用于定义一种受限的数据结构。我们定义一个密封 state 类,包含 content 用于处理数据,Error 用于处理错误。

ba2a7898cc48?utm_campaign=maleskine

继续讲解了 MVI,我们发起 httpRequest 异步请求,让我们的 http 请求和 state 状态关联起来,发起 http 请求时调用 state 的 Loading 加载。

ba2a7898cc48?utm_campaign=maleskine

当 http 请求返回数据时我们调用 state 的 content 方法来铺数据。

ba2a7898cc48?utm_campaign=maleskine

发生错误了调用 onErrorReturn 调用 state 的 Error。

ba2a7898cc48?utm_campaign=maleskine

定义两个状态机,我们定义两个 state 状态机,每个状态机对应一个 http 请求,我们可以轻松地组合两个状态机,通过调用 zip 方法来组合两个状态机,如果触发了一个状态机发生 Error 时就返回这个状态机,可能我们需要等待两个 http 都返回数据时,才开始渲染列表数据,可以通过两个 state 都处于 Loading 时才调用 state 的 Loading。

ba2a7898cc48?utm_campaign=maleskine

ba2a7898cc48?utm_campaign=maleskine

ba2a7898cc48?utm_campaign=maleskine

定义一个 CaculatorStateMachine 计算器状态机,密封类 Input 定义一个一系列数据 Add、Sub、Mul 和 Div 类。这样做的好处可以现在我们输入类型为 Int,限制我们输入类型。

ba2a7898cc48?utm_campaign=maleskine

再定义一个表示计算的状态密封类,状态包含两种数据类型 Result 和 Error。分别用于处理计算器的状态。

ba2a7898cc48?utm_campaign=maleskine

现在我们需要通过一个观察者模式将输入和状态建立一种联系,这里我们使用 RxAndroid,当然你可以选择自己了解响应式框架,或者自己写一个观察者模式来实现,个人更喜欢RxJava 这个响应式框架。使用 PublishRelay 来发布上面定义 input 的类型。

ba2a7898cc48?utm_campaign=maleskine

定义可被观察的 pushlishRelay,我们还需要观察者也就是订阅者了,来订阅这个事件,Conumser来消费这种事件。

ba2a7898cc48?utm_campaign=maleskine

然后用 map 将input 数据类型对应转换为 state 的类型,

ba2a7898cc48?utm_campaign=maleskine

调用Scan 方法来处理 state ,Scan 这个 RxAndroid 操作符可能大家很少用到,如果我说 Reduce 这个操作符,可能大家还多少能有些了解吧,reduce方法把 list中元素归结为一个单独的数值。看一看下图应该对您理解 Scan 有所帮助吧。

ba2a7898cc48?utm_campaign=maleskine

这里 State Reducer 每次接受一个新状态,然后叠加到上一个状态,并不是修改原有状态,其实不是修改上一状态,而是先将上一个状态复制一份然后在此基础上进行修改,也就是每次 scan 都会产生一个新的状态。

ba2a7898cc48?utm_campaign=maleskine

其实这套理论是从 web 前端框架中借鉴过来的,我可以细说一下 redux 帮助大家理解本次分享。

ba2a7898cc48?utm_campaign=maleskine

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值