-
Notifications
You must be signed in to change notification settings - Fork 132
FlowTaskExecutor
张涛(tao281.zhang) edited this page Sep 5, 2022
·
1 revision
- 支持单模块独立初始化
- 支持懒加载初始化
- 独立初始化允许多任务依赖(参考Gradle Task)
- 支持编译期循环引用检测
- 支持自定义业务初始化时机
常用场景:模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在Application
里声明,但是这样可能随着业务变动每次都需要修改Application
所在模块。TheRouter
的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。
无需担心循环依赖造成的问题,框架会在编译期构建有向无环图
,监测循环依赖情况,如果发现会在编译期直接报错。
可以在当前模块中,任意类中声明一个任意方法名的方法,给方法添加上@FlowTask
的注解即可。
@FlowTask
注解参数说明:
-
taskName:当前初始化任务的任务名,必须全局唯一,建议格式为:
moduleName_taskName
-
dependsOn:参考
Gradle
Task,任务与任务之间可能会有依赖关系。如果当前任务需要依赖其他任务先初始化,则在这里声明依赖的任务名。可以同时依赖多个任务,用英文逗号分隔,空格可选,会被过滤:dependsOn = "mmkv, config, login",默认为空,应用启动就被调用 - async:是否要在异步执行此任务,默认false。
/**
* 将会在异步执行
*/
@FlowTask(taskName = "mmkv_init", dependsOn = TheRouterFlowTask.APP_ONCREATE, 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两个任务都执行以后才会被执行");
}
框架默认支持了两个生命周期类任务,可在使用时直接引用
-
TheRouterFlowTask.APP_ONCREATE:当
Application
的onCreate()
执行后初始化 -
TheRouterFlowTask.APP_ONSPLASH:当应用的首个
Activity.onCreate()
执行后初始化
支持定义业务节点,例如隐私协议通过以后才初始化某些方法:
事实上框架默认的两个生命周期任务也是通过这个能力完成的。
// 假设隐私协议任务名为:AgreePrivacyCache
/**
* 同意隐私协议后初始化录音SDK
*/
@FlowTask(taskName="initRecord", dependsOn="AgreePrivacyCache")
fun init(context:Context) = initRecordAudioSDK()
// 当用户同意隐私协议时,调度依赖隐私协议的所有任务执行
TheRouter.runTask("AgreePrivacyCache")
@FlowTask
的dependsOn
参数声明了一个不存在的任务,通常情况下是由于任务名书写错误,建议设置为error
,尽早在编译期发现问题。
可在local.properties
配置编译期属性(warning输出日志,error直接报错)
-
CHECK_FLOW_UNKNOW_DEPEND=warning
warning/error可选
标注FlowTask
的方法需要遵循如下限制:
- 如果是 java,方法必须是 public static 修饰
- 如果是 kotlin,建议写成 top level 的函数
- 参数有且必须只有
Context
,入参为Application