DSAppTeam / Anchors

:white_check_mark: Anchors 是一个基于图结构,支持同异步依赖任务初始化 Android 启动框架。其锚点提供 "勾住" 依赖的功能,能灵活解决初始化过程中复杂的同步问题。参考 alpha 并改进其部分细节, 更贴合 Android 启动的场景, 同时支持优化依赖初始化流程, 自动选择较优的路径进行初始化。
Apache License 2.0
817 stars 79 forks source link

初始化依赖问题 #12

Closed MrsLEO closed 4 years ago

MrsLEO commented 4 years ago

你好,如果我想把一些公共初始化下沉到common层,然后在common层的application启动初始化任务。现在需要在Application中初始化相应task。但是这个task一定需要等待common中某些task初始化完成才可以继续进行,请问这个场景你有什么建议方式呢?

MrsLEO commented 4 years ago

最新版本应该不能同时调用AchorManager start方方法吧。这样做会报空指针。在答应日志的地方。因为start方法会clear相关集合

YummyLau commented 4 years ago

初始化链一般需要在最上层的模块进行处理,等待的方式可以使用anchor功能。这里你遇到的问题实际上是模块的隔离问题。我的建议应该是依赖树应该在最上层模块去处理,因为顶层的模块对下面的模块可见而底层不可见上层依赖。 “任何时刻,依赖树的初始化工作最好在同个模块进行,无论是对于以后维护还是更新而言”。如果你想保留common初始化,那么在common中添加上层(比如application)对应的task,这些task对上层暴露接口,让上层去实现,那么整个依赖树就在common层。但是我仍然建议,在application层实现依赖树的构建和初始化,因为common不应该自己感知到自己的某些节点需要被上层所等待,这个在设计上违背了软件的设计原则。

YummyLau commented 4 years ago

另外,针对重复调用start的问题。start会清空上一次整个树的信息。所以才建议一次性构建完。但是如果这棵树已经完整执行完,那么重新start是可以的,这部分就是新版本追加的功能。 所以树内部的等待再启动,应该使用anchor功能而不是重新start。