组件化的遇到的问题

最近一直在忙着把项目进行模块化,组件化,记录一下在进行模块化过程中遇到的问题。

项目模块化,按什么来分module比较合理?

我的做法比较粗暴,直接按功能分。比如,几乎每个项目都有 设置功能,登陆功能等。
app SettingModule LoginModule

有一些可能使用领域模型来区分模块。很难定义出一个标准的区分模块,就好像项目分包一样,每一个都会有自己的一套。自己觉得方便就好。

Module 与 Module 之间的跳转了?

模块化之后 Ma 和 Mb 之间是不存在依赖关系的,就存在了但Ma 需要 跳转到Mb的某个Activity(或者Mb 跳转到Ma的某个Activity)问题?
使用Event Bus 通信?EventBus的单Module通信的
使用Boardcast?系统广播效率低,但前面的广播阻塞,下一个广播将无法接收
我的做法是
虽然Ma 和 Mb 自己不存在直接依赖的关系,但存在间接依赖,每个Module都依赖BaseModule

Github Module 间通信

后来发现阿里开源来一个ARouter框架,使用起来更方便。
详情看ARouter官网

Application合并

主工程有一个Application,当次级Module也有Application,运行程序会报错,一个工程只能有一个Application。然而当次级Module也需要加载时初始化一些数据怎么办?

可以使用接口抽象的思想。
每个module都会依赖于base module 。
在base module 创建接口 IModule
让需要初始化的Module实现该接口

然后在Application的oncreate方法通过反射统一加载

base Module

public interface IModule {
    void onLoad(Application app);
}

Ma


public class LoginModule implements IModule {
    @Override
    public void onLoad(Application app) {
        Timber.tag("LoginModule").d("-------> LoginModule ");
    }
}

MB


public class SettingModule implements IModule {
    @Override
    public void onLoad(Application app) {
        Timber.tag("SettingModule").d("-------> SettingModule ");
    }
}

主工程


        for(String name : ModuleConfig.moduleList){
            try {
                Class clazz = Class.forName(name);
                Object instance = clazz.newInstance();

                if(clazz.newInstance() instanceof IModule){
                    Method method = clazz.getDeclaredMethod("onLoad", Application.class);
                    method.invoke(instance,this);
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }


        Timber.tag(TAG).d("----- time = " +(System.currentTimeMillis() - l));

反射会损耗性能,对比一下时间,其实没相差多少。

Menifest合并,资源合并

重复的权限,colors、drawable会合并

你可能感兴趣的:(组件化的遇到的问题)