大家好,我系苍王.
[Android] 如何做一个崩溃率少于千分之三噶应用 app-- 章节列表
很多项目都是更新迭代中,才逐渐使用组件化的架构.
可以思考一下以下一些情景.
1. 使用 GreenDao 等 orm 类型数据库,如果你只是使用在登录功能当中,并没涉及到其他信息存储,就因为需要获得用户对象,你是否一定要将整个对象类型下移到 base module 呢?
2. 网络请求的时候,使用 Retrofit 等需要注解的框架,如果某个模块也用到这个请求,是否需要整个请求返回对象和请求封装的 interface 也下移呢?
想清楚以上的问题,如何能在不更改原有代码的基础上,能够正常调用同一层级的其他业务 module 代码呢?这就是本章介绍的内容了.
这里可以分为两种情况,一种是只涉及逻辑,不涉及界面.第二种是涉及到界面的.
首先介绍第一种做法
架构如下图
抽象类解耦设计
1. 定义一个空的 MBaseApi 抽象类
public abstract class MBaseApi {}
2. 定义一个注册类
3. 建立模块的抽象 Api class 放到 BaseModule 当中
public class ModuleApiManager {
static ModuleApiManager instance = new ModuleApiManager();
HashMap < Class < ?extends MBaseApi > ,
MBaseApi > aMap;
public static ModuleApiManager getInstance() {
return instance;
}
private ModuleApiManager() {
aMap = new HashMap < >();
}
public boolean containsApi(Class < ?extends MBaseApi > clazz) {
return aMap.containsKey(clazz);
}
public < T extends MBaseApi > T getApi(Class < T > clazz) {
return (T) aMap.get(clazz);
}
public void putApi(Class < ?extends MBaseApi > key, MBaseApi value) {
aMap.put(key, value);
}
public void removeApi(Class < ?extends MBaseApi > key) {
aMap.remove(key);
}
}
4. 建立模块 Ap 实现类, 这里 PageNameCore 是逻辑类,可以是静态或者是单例.
public abstract class PageNameApi extends MBaseApi {
public abstract String loadPageName();
}
5. 在模块启动的时候调用
public class PageNameImpl extends PageNameApi{
@Override
public String loadPageName() {
return PageNameCore.getInstance().getName();
}
}
ModuleApiManager.getInstance().putApi(PageNameApi.class, new PageNameImpl());
倘若你定义的 Impl 实现类是个单例,填入单例也可以.
6. 模块调用的时候
String pageName = ModuleApiManager.getInstance().getApi(PageNameApi.class).loadPageName();
这样做基本不会让原有的逻辑更改.
如果想使用更新页面逻辑, 可以参考第 7 节的 跨 module 交互 的方式.
这里通过接口的方式来,改造将 BaseApi 和抽象类 Api 改为接口,然后通过注册实现调用.
接口解耦设计
业务模块中的页面逻辑 View,Activity,Fragment 继承接口 Api,然后通过 ModuleApiManager 注册,就可以使用了.
下一节将会更精彩,敬请期待!!!
冬天的清晨唤醒你的应该是梦想吧.
来源: https://juejin.im/post/5a52d0bc6fb9a01ca5604daf