常用场景:模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在Application
里声明,但是这样可能随着业务变动每次都需要修改Application
所在模块。TheRouter
的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。
无需担心循环依赖造成的问题,框架会在编译期构建有向无环图
,监测循环依赖情况,如果发现会在编译期直接报错。
所有的Task
在同一个进程内只会被调用一次,如果你有Task
需要被多次调用,可以使用ActionManager
处理,相关文档请见:https://therouter.cn/docs/2022/08/25/01
可以在当前模块中,任意类中声明一个任意方法名的方法,给方法添加上@FlowTask
的注解即可。
@FlowTask
注解参数说明:
moduleName_taskName
Gradle
Task,任务与任务之间可能会有依赖关系。如果当前任务需要依赖其他任务先初始化,则在这里声明依赖的任务名。可以同时依赖多个任务,用英文逗号分隔,空格可选,会被过滤:dependsOn = “mmkv, config, login”,默认为空,应用启动就被调用。注:dependsOn
只能保证task
是在依赖任务之后执行,由于内部逻辑都是在异步线程操作,取决于线程切换,并不一定是立刻执行。/**
* 将会在异步执行
*/
@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两个任务都执行以后才会被执行");
}
框架默认支持了部分生命周期类任务,可在使用时直接引用
Activity.onCreate()
执行后初始化支持定义业务节点,例如隐私协议通过以后才初始化某些方法:
事实上框架默认的两个生命周期任务也是通过这个能力完成的。
// 假设隐私协议任务名为:AgreePrivacyCache
/**
* 同意隐私协议后初始化录音SDK
*/
@FlowTask(taskName="initRecord", dependsOn="AgreePrivacyCache")
fun init(context:Context) = initRecordAudioSDK()
// 当用户同意隐私协议时,调度依赖隐私协议的所有任务执行
TheRouter.runTask("AgreePrivacyCache")
**从 1.2.3-rc1
版本开始,编译器配置已经迁移到build.gradle
中,具体请查看:1.2.3版本编译改动 **
@FlowTask
的dependsOn
参数声明了一个不存在的任务,通常情况下是由于任务名书写错误,建议设置为error
,尽早在编译期发现问题。
可在local.properties
配置编译期属性(warning输出日志,error直接报错)CHECK_FLOW_UNKNOW_DEPEND=warning
warning/error可选2 . 在编译期,如果想知道当前APP中,总共有哪些FlowTask
,他们之间的依赖关系是怎样的,可以通过在local.properties
配置编译期属性即可。
SHOW_FLOW_DEPEND=true
编译效果如下图所示:
标注FlowTask
的方法需要遵循如下限制:
Context
,入参为Application
每个加了 @FlowTask
注解的方法,都会在编译期被解析,生成一个对应的 Task
对象,这个对象包含了初始化方法的相关信息,比如:是否异步执行、任务名、是否依赖其他任务先执行。
当所有aar都编译完成,生成好全部的 Task
以后,会在主 app 中通过Gradle
插件进行聚合,在这时会将所有的 Task
做一次检查,通过构建有向无环图
来防止 Task
发生循环引用的情况。
每次应用启动后,会在路由初始化时,将有向图中的全部Task
,按照依赖关系按顺序加载。