美文网首页
组件化的遇到的问题

组件化的遇到的问题

作者: maimingliang | 来源:发表于2017-05-20 23:31 被阅读128次

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

    项目模块化,按什么来分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会合并

    相关文章

      网友评论

          本文标题:组件化的遇到的问题

          本文链接:https://www.haomeiwen.com/subject/khujxxtx.html