自定义小插件 - Android线性/连锁式业务功能设计

插件代码参考我的Github: https://github.com/xiaogaojack/android_simple_business_line问题:  经常遇到这样的一种情况:先做事件A, 做完事件A后继续做事件B(B依赖A的执行结果)这样就是链式的业务了,这种链式的功能开发起来很不舒服,必须先调用A,A的回掉再处理B, B的回掉在处理C等等,耦合关系太繁重,代码很混乱? ...
摘要由CSDN通过智能技术生成

插件代码参考我的Github: https://github.com/xiaogaojack/android_simple_business_line

问题:

  经常遇到这样的一种情况:先做事件A, 做完事件A后继续做事件B(B依赖A的执行结果)

这样就是链式的业务了,这种链式的功能开发起来很不舒服,必须先调用A,A的回掉再处理B, B的回掉在处理C等等,耦合关系太繁重,代码很混乱?

 

思路:

  那么有没有一种方式能够单发送业务消息,然后消息内部依次调用。首先我们统统把各个业务消息都发过去,内部执行消息的时候阻塞式依次调用。反正每种业务对于我们是消息,也就没有那么繁琐的耦合逻辑(只需要我们消息按照次序发送就好!)。

 

思路进一步延伸:

  这个有点像消息队列,Android消息队列本身就是消息依次执行的,那么直接利用消息队列发送业务消息行不?

  结果:仅仅系统消息队列处理还是存在问题。如果消息是同步处理完并且给结果:那么每个消息都能处理完自身并有返回。

  但是如果消息中有异步的,那肯定是无法立马返回当前消息执行结果的。

 

设计:

 此次设计思路 还是来源android消息队列。我们可以向消息队列发送多个消息,在消息处理的时候,额外的阻塞式调用就好了。

 

这个时候就需要用到MessageQueue的Block特性了,可能大家都用到的很少。

MessageQueue有这样一个接口:在版本小于23:enqueueSyncBarrier

                                                       版本大于23:postSyncBarrier

 当然方法是隐藏的,因此我们得通过反射获取。

这个方法怎么做的呢?实际是发送一条阻塞消息(这条阻塞消息target为null)。消息队列在循环的时候,如果判断当前消息为阻塞消息的话:会循环找消息(默认消息都是同步的),这个时候会发现,最后的消息为null。因此就不会执行消息。

 

既然有阻塞功能,那么后面就容易了。

(1)我们消息队列正常发送业务消息(如A, B)。

(2)在handler当次业务消息(如A),我们发送一条阻塞消息。

      注:阻塞消息要发送到队列的头部(怎么确保阻塞消息到头部,需要设置发送时间比其他消息都早,定义消息执行时间即可

(3)等到A消息执行完毕后,我们通知一下消息队列,取消阻塞消息。

(4)继续执行后面消息B(依次类推)

 

这样的好处是:我们不用再业务处理回调中调用其他业务。我们仅仅在业务处理完毕后,通知消息队列处理下条消息即可。

基本模型:(1) 业务组件首先 创建一个线程消息队列环境,以及线程Handler

                  (2) 业务组件注册业务动作,并发送到消息队列,通过handler执行,并阻塞

                  (3) 业务动作内部实现业务逻辑,业务逻辑处理完成后(无论同步,异步),发送通知给业务组件

                      此次执行完成,可以释放阻塞。

                   (4)业务组件继续执行下一个业务动作

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值