业务节点订阅(自动初始化)能力介绍


常用场景:模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在Application里声明,但是这样可能随着业务变动每次都需要修改Application所在模块。TheRouter的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。

使用介绍

无需担心循环依赖造成的问题,框架会在编译期构建有向无环图,监测循环依赖情况,如果发现会在编译期直接报错。

所有的Task在同一个进程内只会被调用一次,如果你有Task需要被多次调用,可以使用ActionManager处理,相关文档请见:https://therouter.cn/docs/2022/08/25/01

可以在当前模块中,任意类中声明一个任意方法名的方法,给方法添加上@FlowTask 的注解即可。

@FlowTask 注解参数说明:

/**
 * 将会在异步执行
 */
@FlowTask(taskName = "mmkv_init", dependsOn = TheRouterFlowTask.THEROUTER_INITIALIZATION, async = true)
public static void test2(Context context) {
    System.out.println("异步=========Application onCreate后执行");
}

@FlowTask(taskName = "app1")
public static void test3(Context context) {
    System.out.println("main线程=========应用启动就会执行");
}

/**
 * 将会在主线程初始化
 */
@FlowTask(taskName = "test", dependsOn = "mmkv,app1")
public static void test3(Context context) {
    System.out.println("main线程=========在app1和mmkv两个任务都执行以后才会被执行");
}

内置初始化节点

框架默认支持了部分生命周期类任务,可在使用时直接引用

自定义业务节点初始化

支持定义业务节点,例如隐私协议通过以后才初始化某些方法:

事实上框架默认的两个生命周期任务也是通过这个能力完成的。

// 假设隐私协议任务名为:AgreePrivacyCache

/**
 * 同意隐私协议后初始化录音SDK
 */
 @FlowTask(taskName="initRecord", dependsOn="AgreePrivacyCache")
 fun init(context:Context) = initRecordAudioSDK()

// 当用户同意隐私协议时,调度依赖隐私协议的所有任务执行
TheRouter.runTask("AgreePrivacyCache")

编译期配置

**从 1.2.3-rc1版本开始,编译器配置已经迁移到build.gradle中,具体请查看:1.2.3版本编译改动 **

  1. @FlowTaskdependsOn参数声明了一个不存在的任务,通常情况下是由于任务名书写错误,建议设置为error,尽早在编译期发现问题。 可在local.properties配置编译期属性(warning输出日志,error直接报错)

2 . 在编译期,如果想知道当前APP中,总共有哪些FlowTask,他们之间的依赖关系是怎样的,可以通过在local.properties配置编译期属性即可。

编译效果如下图所示:

TheRouter FlowTask

初始化方法的限制

标注FlowTask的方法需要遵循如下限制:

实现原理

每个加了 @FlowTask 注解的方法,都会在编译期被解析,生成一个对应的 Task 对象,这个对象包含了初始化方法的相关信息,比如:是否异步执行、任务名、是否依赖其他任务先执行。

当所有aar都编译完成,生成好全部的 Task 以后,会在主 app 中通过Gradle插件进行聚合,在这时会将所有的 Task 做一次检查,通过构建有向无环图来防止 Task 发生循环引用的情况。

每次应用启动后,会在路由初始化时,将有向图中的全部Task,按照依赖关系按顺序加载。

相关推荐:

TheRouter 使用 KSP 处理注解TheRouter 使用 KSP 处理注解

TheRouter 在`1.1.4-rc2`开始,已经将`KSP`能力合并至主分支,不再是单独的功能分支了,下面介绍一下如何使用 `KSP`。 ##...

2 mins
跨模块依赖注入跨模块依赖注入

模块化能力支持项: - 支持跨模块依赖注入 - 支持自定义注入项的创建规则,依赖注入可自定义参数 - 支持自定义服务拦截,单模块mock调试 - 支...

4 mins
动态化能力支持:ActionManager动态化能力支持:ActionManager

Action 本质是一个全局的系统回调,主要用于预埋的一系列操作,例如:弹窗、上传日志、清理缓存。 与 Android 系统自带的广播通知类似,你可以在任何地方声明动作与处理方式。并且所有 Action 都是可以被跟踪的,只要你愿意,可以在日志中将所有的动作调用栈输出,以方便调试使用。

6 mins