阿里的ARouter浅析

1.学习

这是一个学习的篇子…然后我只是把简单的学习放在这里。具体的这里都不分析…

2.众所周知

反正不懂就是众所周知.ARouter解决了组件化之间不依靠依赖就可以进行跳转。
根本原因是什么呢?
无论哪个模块的Activity最终都会打包到同一个apk内,从代码文件上来讲,这写Class文件都是互相可见的,这就需要添加第三方来让各自可见了.类似于中介的一个角色.
ARouter其实也是如此,利用了Map去保存下来了其中的Class。在startActivity再将其对象提取出来.只是其中过程有注册路由,提取路由.不同罢了.

3.拨开云雾见光明

如果不懂得本质是什么,只是看源码是真的痛苦…
先来一张时序图来折磨大家~
在这里插入图片描述
再来一张Warehouse的数据结构继续折磨大家.

class Warehouse {
    // Cache route and metas
    static Map<String, Class<? extends IRouteGroup>> groupsIndex = new HashMap<>();
    static Map<String, RouteMeta> routes = new HashMap<>();

    // Cache provider
    static Map<Class, IProvider> providers = new HashMap<>();
    static Map<String, RouteMeta> providersIndex = new HashMap<>();

    // Cache interceptor
    static Map<Integer, Class<? extends IInterceptor>> interceptorsIndex = new UniqueKeyTreeMap<>("More than one interceptors use same priority [%s]");
    static List<IInterceptor> interceptors = new ArrayList<>();

    static void clear() {
        routes.clear();
        groupsIndex.clear();
        providers.clear();
        providersIndex.clear();
        interceptors.clear();
        interceptorsIndex.clear();
    }
}

大家先暂时不用管这两张图,但是这个数据结构是比较重要的入口

4.整体流程步骤

1.根据APT生成编译文件
在编译包下,我们可以很清楚的看到,由ARouter下,生成了三个不同的文件.
Group–>用于存储所有的路由组
Root->存储所有的路由
其它暂时不用管,以此看来Warehouse就是里面的路由文件的映射表.
我们对Arouter有一个认知:我们的Class都要注册进入路由内,再提取出来进行startActivity.而Warehouse是我们的路由表

在这里插入图片描述
2.完成路由表的注册以及,加载内存
注册是看我们的ARouter.init()初始化.
可以看到,这里是将上面的ARouter开头的文件挑选出来,反射创建对象。然后通过loadInto函数将分组信息载入到Warehouse.groupIndex内

public synchronized static void init(Context context, ThreadPoolExecutor tpe) throws HandlerException {
    
            // 获取com.alibaba.android.arouter.routes下的所有class文件
            routerMap = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
            
    
            for (String className : routerMap) {
                if (className.startsWith(ROUTE_ROOT_PAKCAGE + DOT + SDK_NAME + SEPARATOR + SUFFIX_ROOT)) {

                    // 将名为ARouter$$Root开头的Class对象创建出来,并调用loadInto(),将分组信息加载进Warehouse.groupsIndex中
                    ((IRouteRoot) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.groupsIndex);
                }
                ...
            }
    }

加载内存,则分析出它的跳转过程为如此:

过程:
1、当传入path进行跳转时,优先从Warehouse.routes中直接获取路由对象;
2、路由对象不存在,就需要通过Warehouse.groupsIndex路由组来完成注册功能;
3、注册成功后,当前path所在组的所有路由都将存储到Warehouse.routes中;
4、回到第1步,获取路由对象;
5、读取路由对象信息;
6、完成跳转

所以最终,我们总结出ARouter的基本过程解析为:
1.使用Apt,将注解的文件成文ARouter$$相关文件。

2.init()初始化,将ARouter$$Group前缀文件涉及到的路由组存储到Warehouse.groupIndex内(其中有涉及到反射调用ARouter文件获取信息).

3.在跳转页面时,查询groupsIndex路由所在组,将路由组中所有的路由注册到Warehouse.routes中,从Warehouse.routes中取出路由信息,完成跳转.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值