众所周知kotlin协程写异步流非常方便。

今日在刷公众号的时候,看到关于在Application.onCreate()加载框架耗时优化的文章,搜了些相关文章。

思路大概是:

  1. 建立有向无环图
  2. 建立线程池,可以同时加载多个框架
  3. 单个框架加载完成后,对依赖此框架的加载项解一次锁
  4. 后续的框架查询是否前置依赖已经完成
  5. 所有依赖完成后释放所有锁onCreate()完成

分析

  • 采用Thread实现同时加载多个框架 (这很不kotlin)
  • 是否可以采用协程来进行这样的优化

方案思考

  • 协程中有ansyc await runBlocking
  • 有前置依赖的项目在其自己的ansyc前先await前置依赖

实践

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        initEnd("Start")
        runBlocking {
            val taskA = async { initA() }
            val taskB = async { initB() }
            val taskCWaitA = async {
                taskA.await()
                initC()
            }
            val taskDWaitBC = async {
                taskB.await()
                taskCWaitA.await()
                initD()
            }
        }
    }

    private fun initA()
    private fun initB()
    private fun initC()
    private fun initD()
}

数据对比&总结

这暂时只是一个思路,目前用到的项目还没用到很多加载很耗时的框架,更没有线上数据做支撑。

这个方案用到了kotlin协程的特性,不需要额外封装,没有附加的依赖,代码可读性也很强,个人认为还是很好的一个方法,等后续有数据可以验证后再下定论。

Q.E.D.