Skip to content

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:当ApplicationonCreate()执行后初始化
  • TheRouterFlowTask.APP_ONSPLASH:当应用的首个Activity.onCreate()执行后初始化

自定义业务节点初始化

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

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

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

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

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

编译期配置

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

  • CHECK_FLOW_UNKNOW_DEPEND=warning warning/error可选

初始化方法的限制

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

  • 如果是 java,方法必须是 public static 修饰
  • 如果是 kotlin,建议写成 top level 的函数
  • 参数有且必须只有Context,入参为Application