ARouter:一个好用的组件化通信解耦的框架
可对照该博文一起理解,该博文整个流程也讲的很详细
通过编译时注解结合java-poet生成的路由映射表文件类型如下:
ISyringe:用于赋值Autowired标记的成员
IRouteGroup:用于添加路由路径和与之对应的路由标签信息
IRouteRoot:用于添加分组组别下的路由标签信息,一个组对应该组下的所有IRouteGroup类
IProviderGroup:用于添加IProvider类型的路由路径和路由标签信息
IInterceptorGroup:用于添加IInterceptor类型的路由路径和路由标签信息
初始化
ARouter初始化的目的是将编译期间通过java-poet生成的路由表文件class路径名称添加到内存中(存储在HashSet中)
初始化加载路由表文件方式有两种:
- 通过ARouter-Plugin插件在编译期间通过Transform的方式将路由表文件class路径加载到HashSet中
- 通过在Application中调用ARouter.init(this)方法扫描Dex中的类过滤加载路由表文件class路径到HashSet中(会在线程池中执行)
然后,遍历HashSet分类反射Root、Interceptors、Providers的示例对象,调用loadInto方法将每个使用ARouter注解的类存储到Warehouse的groupsIndex、providers、providersIndex中缓存。
@Autowired注解赋值
在使用ARouter.getInstance().inject(this)时候,会通过路径构建Postcard在其内部通过反射构建实例对象AutowiredServiceImpl,在AutowiredServiceImpl内部获取Autowired文件的示例对象,调用inject()方法实现@Autowired注解标记的成员赋值。
导航跳转
在使用ARouter.getInstance().build().navigation()跳转,在函数链上首先会构造Postcard,如果构建出错会走降级逻辑;构建成功会判断是不是绿色通道,如果不是那么会走拦截器的逻辑,如果在拦截器链上回调了onContinue方法,那么会接着判断Postcard的类型,如果是Activity那么会构建Intent等信息,检查切换主线程调用startActivity跳转;如果是Fragment、广播接收者、ContentProvider会直接通过反射实例对象返回。如果在拦截器链上走了onInterrupt方法,那么会通过NavigationCallback回调出去。
RxJava:一个简化异步调用的库,更是一种优雅的编程方式和编程思想
特点
简洁,免除传统异步代码逻辑中的callback
增加业务逻辑代码的可读性
学习理解RxJava2.0可以参详这篇博文
主要搞清楚两个概念
事件流
线程调度
事件流
执行代码时,自上而下每一步操作符都会创建一个新的Observable(均为Observable的子类,对应不同的操作符),当执行create时,创建并返回了ObservableCreate,当执行map时,创建并返回了ObservableMap,并且每一个新的Observable都持有它上游的源Observable(即source)及当前涉及到的操作函数function。当最后一步执行订阅方法subscribe时会触发ObservableMap的subscribeActual()方法,并将最下游的Observer包装成MapObserver,同时该方法又会继续调用它所持有ObservableCreate的订阅方法(即执行source.subscribe),由此也会触发ObservableCreate的subscribeActual()方法,此时我们的发射器CreateEmitter才会调用它的onNext()方法发射事件,再依次调用MapObserver的操作函数mapper和onNext()方法,最终将事件传递给了最下游的Observer的onNext()方法。
每个操作符既是一个观察者,订阅上面的数据流,也是一个被观察者,发送经过其处理的数据源。所以:RxJava形成的可观察事件序列,除了首尾,中间事件节点,都是既是观察者又是被观察者,其向上订阅,向下分发数据,
我们可以将RxJava形成的事件序列可称为数据流,数据从最初的Observable流向最后的Observer。
线程调度
subscribeOn:用于指定上游所在的线程
observeOn:用于切换指定下游所在的线程
切换到子线程通过指定schedules线程类型在方法scheduleActual中添加将线程池中执行
切换到主线程,通过指定主线程的handler,然后通过handler发送一条附带callback的消息,在handler的dispatchMassage方法中执行msg的callback.run()实现切换
VirtualAPK
热修复
网友评论