[源码]ARouter

46 篇文章 0 订阅
36 篇文章 1 订阅

ARouter是大阿里开源的Android App“架构”类框架。最主要的就是解除依赖的,包括了页面的依赖、功能的依赖;还有hook、降级、绑定用的语法糖等。

结构

并没有很复杂的结构:
- ARouter作为总的对外接口,跳转和获取Service都靠同一个navigation接口。这里不太理解,作者可能认为一个接口可以更加封装具体行为,但我觉得拿Service是一个有别于跳转的行为,应该独立
- _ARouter是总调度,真正执行具体行为的。至于为什么不放到ARouter里,而且二者完全没有继承关系,我也是不甚理解
- 每次事件都靠一个叫Postcard的对象作为Context存在,串联所有
- LogisticCenter是所有逻辑的Utils
- WareHouse是所有核心配置的所在

这个里面最出彩的大概就是编译期处理Annotation,生成类了,里面各种注册都靠着Annotation完成。同样的功能,还有两种其他的实现方法:
- 配置文件+运行时反射:其实Android原生的跳转就是这个方法。Manifest的问题呢ARouter作者说了很多,实践中主要是所有非Java的东西,都是脱离于编译期检查的,容易出错。当然,反射这个东西本来也就不靠谱,会慢
- set:这个就感觉太混乱了,而且繁复。仅仅适用于较少量的,用于提供基础功能的proxy,比如setLBSProxy

合理设计

  • 不想使用运行时反射,就在编译时,用Annotation把信息都生成到一个Config文件中。这其实类似于js的eval,是个很好的办法——RouterProcessor、AutowiredProcessor
  • 对于路由这种变数比较大(起Activity或者拿Service)的多步流程,可以使用Context模式,每一步都传递、修改同一个Context,最后的结果也放到Context中——Postcard
  • 对于Android来说,hook Instrumentation可能是最高效的控制Activity的方法——InstrumentationHook
  • Autowire也是用的编译时处理,每个类对应着一个编译期生成的Helper,进一步减少了反射——AutowiredProcessor

问题

  • interceptor明显可以用循环搞定,不知道为什么要用递归——InterceptorServiceImpl#_excute
  • Postcard是Intent的扩展,但flag并没有放到Intent里
  • Autowire不支持private的field,其实,生成成匿名内部类就可以了啊
  • 现在我见过(也没有几个)的框架,在做界面IOC的时候,都是用的Map<String, Activity>类似的映射,这里面其实忽略了一个开发过程中的口头约定:Activity作为一个黑盒处理流程的入参(Intent中的内容)。这里面有Key的名字,Value是否为空,Value类型等等。要解决的话,能想到的是每个模块有一个Facade,Facade有形如startXXX(Context context, String arg0, int arg1...)的接口,带参数启动页面。Facade通过AnnotationProcessor生成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值