Skip to content

基本介绍和架构介绍

xiaojinzi123 edited this page May 5, 2019 · 1 revision

组件化的几个重点

组件化的方式很多,但是每一个组件化都必须有这三点,我们做组件化只要保证做到这三点其实就是做了组件化了

  • 业务组件之间的隔离
项目拆分成多个 module
  • 业务组件之间的服务的提供
某个业务组件中的服务如何让别人使用
也可以理解为平行没有依赖关系的模块A和B之间,A如何向B提供A业务模块的功能
  • 业务组件之间的跳转
路由
  • 基础组件的下沉
比如:(实体对象,网络请求模块,数据库,本地存储.....)
  • 业务组件加载和卸载的生命周期
业务组件的生命周期(为每一个业务模块带去类似于Application的概念)
业务组件的动态的加载和卸载,比如像大公司的 App,后台能下发指令,下架某一个模块,比如 滴滴 在顺风车出现问题的情况下,下架手机上的顺风车的功能
这就是 '业务组件加载和卸载的生命周期' 可以做到的事情

示例代码

github地址:组件化示例项目

这个项目里面实现了组件化的方案,并且使用组件化方案写了一个 Demo,整个项目架构如下:

image.png

  • app
壳工程
  • ModuleBase
基础库工程
  • Module1
业务组件1
  • Module2
业务组件2
  • ModuleUser
用户业务模块
  • ModuleHelp
帮助业务模块
  • ComponentApi
组件化的注解Api
  • ComponentCompiler
组件化的注解Api注解驱动器
  • ComponentImpl
组件化的基础实现
  • ComponentRxImpl
组件化结合Rxjava2的实现,这个ComponentRxImpl实现中会有一个很好用的功能,基于ComponentApiImpl扩展

特别注意

任何一个组件化框架,在跳转这件事情上,都需要额外的小心,下面是示例代码:

注意运行线程

由于框架在路由的开始的时候可能需要操作 Fragment,所以必须在主线程上执行,所以这点还请注意 本来没有返回值的话还能在子线程上走,我帮您切换到主线程上,但是还有一个返回值,所以没办法,只能在主线程了

没组件化之前跳转

Intent intent = new Intent(this.XXX.class);
startActivity(intent);
finish();

使用组件化之后

Router.with(context)
        .host("host")
        .path("path")
        .navigate();
finish();

前一种写法是没有问题的,因为跳转的信号已经发送到系统,然后紧接着又发送了结束当前Activity的信号,系统会依次执行这两个信号要执行的代码 后一种写法使用了路由跳转就会有问题,这个问题在任何一个框架中都会存在

因为使用了路由跳转,中间有可能会经过若干拦截器,所以最终的跳转的代码 startActivity(Intent) 都会晚于 finish(); 代码,所以就会导致界面先销毁了然后再跳转,而一个销毁了的 Activity 是不可以打开另一个 Activity 的,所以这种写法一定要注意,这是错的

正确的写法

Router.with(context)
        .host("host")
        .path("path")
        .navigate(new CallbackAdapter(){
                @Override
                public void onEvent(@Nullable RouterResult result, @Nullable Exception error) {
                        super.onEvent(result, error);
                        finish();
                }
        });

这样子就在这个路由结束之后执行的, onEvent 失败和成功都会执行,onError 会在失败的时候执行, onSuccess 会成功的时候执行,你可以自由的选择,如果你想在成功的里面执行还有一种方式就是上面介绍的 onAfterJump ,也可以实现

总结

小结

到此组件化的方案介绍完毕,里面有很多基于得到的经验,也有很多的调整改进和优化 如果有兴趣想更清楚内部的实现,请详细的去琢磨以下三个 module 中的代码吧,不明白的可以来和我交流 image.png

Clone this wiki locally