组件化的遇到的问题

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,925评论 25 709
  • 1. App项目组件化 做移动开发的同学都会发现这两年在移动开发圈子里最火的就是组件化了,组件化不同的实现方案也引...
    monkey01阅读 10,725评论 6 56
  • 本篇文章不是教大家如何搭建和使用模块化,这样的文章网上太多了。主要是和大家探讨下在使用模块的过程有哪些问题、解决方...
    Chiclaim阅读 776评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,083评论 19 139
  • 许久不及感情的问题,从三十而立的年龄开始,就奔着“立”去了,立的没有了情感觉知,立的没有了感情纠葛。每天朝九晚...
    巍然0619阅读 592评论 5 4