Android 跨 module 交互和方法调用

阅读 4647
收藏 105
2016-10-27
原文链接:www.jianshu.com

以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

[Android]如何做一个崩溃率少于千分之三噶应用app(1)-module工程架构

[Android]如何做一个崩溃率少于千分之三噶应用app(2)-完全退出App

[Android]如何做一个崩溃率少于千分之三噶应用app(3)-极速编译

[Android]如何做一个崩溃率少于千分之三噶应用app(4)-极速编译*续

[Android]如何做一个崩溃率少于千分之三噶应用app(5)-极速增量编译

[Android]如何做一个崩溃率少于千分之三噶应用app(6)-动态创建

这节我们介绍的是如何跨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建立统一的数据接口,然后每个模块做读写操作,需要注意的是同步异步的问题。

这一节就介绍到这里

项目往往多渠道,某些渠道可能需要某些功能模块的时候或者不需要某些模块,应该如何处理

下一节,将会介绍如何添加一个不同的模块。

敬请期待!!!

评论