自定义小插件 - Android线性/连锁式业务功能设计
插件代码参考我的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)业务组件继续执行下一个业务动作