观察者模式和依赖注入(更优雅的撸代码)
Android项目现在越来越流行的观察者模式来进行代码的解耦,更加优雅的撸码。比如现在比较火的RxJava,EventBus等等,都是基于观察这模式的。我今天分享的也是我上一个项目中,使用观察者模式对代码进行解耦。
项目中遇到的问题:单个类的代码复杂多很高,甚者超过几千行的类逐步增多。电商类App,UI占据了很多的成分。UI变化时,牵一发动全身。特别是一个人写的东西,不感觉让别人去顶替修改,人员离职后交接成本很大。
后来终于到了我无法忍受的时候,于是就大胆的进行了重构。重构目标
:将复杂的类进行拆分(去除各种复杂的回调代码),降低耦合度,增加阅读性和维护性。并且有利于进行patch打补丁包。
下面大概说一下当时的思路解决方案
:
- 使用观察这模式,将类与类直接的关系进行尽可能的解耦,增加阅读性。
引入EventBus等第三方库,进行解耦操作;自己实现一套自己的观察者模式事件库。 - 按照依赖注入的方式,避免一些重复的代码。
使用第三方依赖注入库。ButterKnift,。。。。
EventBus引入之后,效果不是很明显。
原因:1.EventBus不支持注解形式的观察方法(不知到目前支不支持)
,而是支持已方法名的形势进行方法匹配。这就导致了很多事件,在一个类中需要在同一个方法中处理,看起来不太舒服。 - EventBus功能是很强大,但是代码量比较大,维护比较费劲。由于原来使用Picasso和那个Glide的事遇到一些问题,例如使用Picasso在
vivo等某些国产机器
上下载图片非常慢,还经常闪退,而阅读其源码话费了很大功夫,特别是Glide库,特别大。可悲的是我们没能查出来是什么原因导致的这个问题。从那以后基本是就是能自己很快完成的就是参考别人的自己写,这样方便以后维护。实现自己的观察者模式的事件机制
首先做的事情:起一个比较霸气的命名?啥也不说了,想不起来。最后直接就叫M。
实现原:观察者模式,与EventBus基本相同。不同:结合注解,支持通过注解的方式调用方法。使用方式
M的原理
自定义合适的注解,作用在方法级别的
type是指的对改时间的一个描述添加观察者
- 过滤出当前含有自定义注解的方法
- 将观察者(MReciever对象,以及处理方法)按照事件类型来进行存储
- 发送消息,接受到数据之后,通知给观察者
通过handler统一处理发送
观察者接受指定类型的事件和数据
整个过程仅仅只是用了五个类,就将原来耦合到一起的很复杂的代码进行了降低耦合,更加方便了代码的维护和阅读。
这样重构带来的优点:
1.减小的代码的耦合度,方便维护和多人开发;2.有利于我们打patch包,就是当我们线上发现某些比较严重的bug,我们只需要对特定的接受方法进行处理,这打patch的工作量会大大减小,如果类与类之间耦合度很高,patch就需要改动很多地方,不利于热修复补丁。
简单的依赖注入
MInject 就是一个View的注入工具。实现原来基本跟butterknift相同,就是通过注解的方式对View进行注入。使用方式也跟butterKnift基本一样。
唯一的区别:支持点击事件设置点击抖动事件,有点类似于RxAndroid中的某些View框架,可以方便的设置点击抖动时间。
实现原理:对View.OnClickListener接口的一个动态代理
杂项:aar上传jcenter,远程仓库统一管理
gradle中新建了一些Task,依赖jcenter提供的插件就可以非常轻松的实现。MInject这个我就放到了jcenter上。通过gradle调用很方便。1
compile 'com.glanwang.minject:MInject_core:1.0.0'
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0623/3097.html