[Android]如何做一个崩溃率少于千分之三噶应用app(7)
以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。
[Android]如何做一个崩溃率少于千分之三噶应用app--章节列表
我建立了一个关于Android架构学习的群,里面可以进一步进行组件化学习的交流。
群号是316556016,也可以扫码进群。我在这里期待你们的加入!!!
这节我们介绍的是如何跨module交互,大家可以先思考一下下面的问题。
你考虑过android studio设计module的独立性?
你是否考虑过module之间可以如何交互通信,传递信息?
如果移除module的依赖的时候,依然能让交互的代码不产生崩溃?
希望看完这一节,希望对大家有一定的启发。
1.上层module和下层module的交互
(1)如果module是上下层的关系(例如一个module 依赖一个base的module)那么上层的module是可以直接获取base module的接口,达到信息取得的。
(2)那么base module并不会依赖于上层的module的(这是设计的初衷),那么如何获取上层module的信息呢?这里其实就可以简单用到抽象接口的调用子类的实现了。
这一切都是源于module之间的依赖形态所可以达到的效果
这是我们只要module依赖都会遇到过的问题。
2.两个相同层的module通信
可以想象两个相同层的module如果相互之间并没有直接的依赖关系,我们是没法传输到数据的。
那么用EventBus事件总线呢?是否有人试过?
试验过都会被modules间的这道墙所隔离。(EventBus只能用在单module里通信)
可以想象使用boardcast ,这是安卓本身系统带有可以整个系统里告知信息,通过boardcast广播应该是可以做到的传输的,唯一不好的地方就是其效率不高(至少会比EventBus要低)
也会有人提到数据库?但是如果你一直在监听着某些数据的变化,也会产生有一定的消耗的。
那为何module间不直接相互依赖,这样不就可以解决问题呢?倘或一个module被多个module依赖,那些module都会调用这个module的方法,那么这样移除这个module将会是致命的,将需要增加以后维护的难度。我们设计的初衷是松耦合。
我们的同层的modules没法直接依赖,但是可以做到间接依赖的。
我们相同层的modules都依赖于一个base的module。
那么我们就可以做一个监听者模式的设计,每个module把想要传输的响应接口注册到base模块里面,然后相应的module调用想要传输到传输模块的接口,就可以完成信息的传输,跨模块接口的调用。
关于监听者模式,如果有深入了解过EventBus和boardcaset源码分析应该都明白这种设计模式的魅力。
下面是教大家如何切实的做一个类似的传输源码
(1)需要用到的文件架构
(2)在base里面新建一个ElModuleApi的接口
(3)建一个ELPublicApiHelper的类,用于动态注册相关的ELMouleApi到moduleApi的哈希Map里面
这里面提供register和unregister的注册和注销静态接口,把类映射到moduleApi里面,getModuleApi可以取出相应通过类名取出ELModuleApi的接口,用于之后的方法调用
(4)因为本来设计就是用MVP设计,那么我们统一继承一个BasePresenter
在初始化的时候,就将map注册到moduleApi里面,然后destroy的时候,默认移除
这里抽象getModuleApi的接口到子类实现
(5)例如我们需要在Presenter实现调用updateRecordView的方法,需要在ELPublicApi里面新添加一个继承ELModuleApi的RecordApi的接口,里面添加接口方法。
(6)子类Presenter的实现
先继承BasePresenter 和调用方法的接口
复写getModuleApi的方法,将api类名和相应的接口名注册到map里面
复写接口真正的实现方法
(7)这样在工程的任意地方,都可以调用通过ELPublicApiHelper和接口类名调用到接口的方法了
这样完成了跨module间数据的传输和方法的调动。
3.有些人考虑使用数据库的方式,那么因为modules这个墙,我们只能在依赖的base module建立统一的数据接口,然后每个模块做读写操作,需要注意的是同步异步的问题。
********************2016.11.23更新*********************
我在ModuleBus交互提供了交互的新的module交互框架,有兴趣的话,可以查看一下。
这一节就介绍到这里
项目往往多渠道,某些渠道可能需要某些功能模块的时候或者不需要某些模块,应该如何处理
下一节,将会介绍如何添加一个不同的模块。
敬请期待!!!