Android 多Modules 单向依赖双向沟通的思路(上)

目录

 

 

1. 问题

2. 思路

3. 目录

4. 代码

4.1 APP 主工程 - 初始化调用

4.2 APP 主工程 - AppCommonWorkObject

4.3 Modules 层 - XXXCommonResourcesObject


 

1. 问题

1. 实际开发中,一个APP 主工程依赖多个子 Modules的情况,此时由于单向依赖的存在,子 Modules 中的某些地方需要和APP/Modules 进行通信;

2. 由于技术上的单向依赖,尽管市面上也会有此类的通用第三方库来解决,但本着项目尽可能少的引入第三方和可持续性维护的原则,决定自己折腾一套;

 

2. 思路

1. 在APP 主工程中设定一个全局公共工作组对象(AppCommonWorkObject),单例模式;

2. 在各个子 Modules 中存在一个Modules 层公共资源对象(XXXCommonResourcesObject),单例模式;

3. Android Application 实例中,使用单例全局公共工作组对象(AppCommonWorkObject)维护注册一组Modules 层公共资源对象(XXXCommonResourcesObject);

4. 在各个子 Modules 中声明一个Modules 层全局通用接口(IXXXCallback),声明此处的一个空接口主要起到接口标签的作用,Modules 层的调用服用由公共资源对象(XXXCommonResourcesObject)来执行get/set 维护操作;

5. APP 层和各个子 Modules 层沟通和通信主要通过自己起用的一个概念:接口标签,来关联调用与执行;

 

具体的实现过程,如下图所示:

 

3. 目录

典型的目录结构如下所示,

-- APP 工程

     -- common

          -- AppCommonWorkObject

          -- impl

              -- XXXImpl

              -- YYYImpl

              -- ZZZImpl

...

 

-- Modules 工程

     -- common

          -- XXXCommonResourcesObject

          -- callback

              -- IXXXCallback

              -- IXXXZYXCallback

4. 代码

 

4.1 APP 主工程 - 初始化调用

AppCommonWorkObject.getInstance().setXXXCallback(new XXXImpl());

 

4.2 APP 主工程 - AppCommonWorkObject

public class AppCommonWorkObject {

    private static final AppCommonWorkObject INSTANCE = new AppCommonWorkObject();

    public static AppCommonWorkObject getInstance() {
        return INSTANCE;
    }

    private AppCommonWorkObject() {
    }

    protected IXXXCallback callback; // Modules 层ICallback,建议为超级接口(接口标签)
    
    public IXXXCallback getXXXCallback() {
        return callback;
    }

    public void setXXXCallback(IXXXCallback callback) {
        this.callback = callback;
        if (null != callback) {
            //noinspection ConstantConditions
            if (callback instanceof IXXXCallback) { // 具体接口 IXXXCallback
                XXXCommonResourcesObject.getInstance().setXXXCallback(callback);
            } else if(callback instanceof IXXXZYXCallback) { // 具体接口 IXXXZYXCallback 
                // XXXCommonResourcesObject.getInstance().setXXXCallback(callback);            
            } else {
                // nothing to do
            }
        }
    }
}

 

4.3 Modules 层 - XXXCommonResourcesObject

public class XXXCommonResourcesObject {
    
    private static final XXXCommonResourcesObject INSTANCE = new XXXCommonResourcesObject();

    public static XXXCommonResourcesObject getInstance() {
        return INSTANCE;
    }

    private XXXCommonResourcesObject() {
    }

    protected IXXXCallback callback;

    public IXXXCallback getCallback() {
        return callback;
    }

    public void setCallback(IXXXCallback callback) {
        this.callback = callback;
    }
}

此时各个层使用各个业务层对象:

1. APP 主工程使用实现了IXXXCallback 接口的XXXImpl 对象;

2. Modules 层使用XXXCommonResourcesObject  进行IXXXCallback 伪代码调用即可;

 

 

 

这个只是自己临时解决上线问题所想出来的一个简单办法,如有更好的想法,欢迎一块讨论交流技术;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值