-
Notifications
You must be signed in to change notification settings - Fork 208
基本介绍和架构介绍
xiaojinzi123 edited this page May 5, 2019
·
1 revision
组件化的方式很多,但是每一个组件化都必须有这三点,我们做组件化只要保证做到这三点其实就是做了组件化了
- 业务组件之间的隔离
项目拆分成多个 module
- 业务组件之间的服务的提供
某个业务组件中的服务如何让别人使用
也可以理解为平行没有依赖关系的模块A和B之间,A如何向B提供A业务模块的功能
- 业务组件之间的跳转
路由
- 基础组件的下沉
比如:(实体对象,网络请求模块,数据库,本地存储.....)
- 业务组件加载和卸载的生命周期
业务组件的生命周期(为每一个业务模块带去类似于Application的概念)
业务组件的动态的加载和卸载,比如像大公司的 App,后台能下发指令,下架某一个模块,比如 滴滴 在顺风车出现问题的情况下,下架手机上的顺风车的功能
这就是 '业务组件加载和卸载的生命周期' 可以做到的事情
github地址:组件化示例项目
这个项目里面实现了组件化的方案,并且使用组件化方案写了一个 Demo,整个项目架构如下:
- 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 中的代码吧,不明白的可以来和我交流