refactor: 重构三方依赖初始化的逻辑
This commit is contained in:
@ -51,13 +51,6 @@ open class BaseApplication : MultiDexApplication() {
|
||||
|
||||
/**
|
||||
* 初始化第三方依赖
|
||||
*
|
||||
* 步骤:
|
||||
* * 1. 首先开启一个后台协程对不会立即使用的第三方进行初始化
|
||||
* * 2. 对需要被立即使用的第三方进行初始化
|
||||
* * 2.1 首先是并行对非必须要在主线程初始化的依赖进行初始化 此时不用管初始化是否完成 紧接着进行下一步
|
||||
* * 2.2 对必须要在主线程初始化的依赖进行初始化 由于是在主线程 所以后面的操作等待初始化完成 这部分时间不能浪费掉 这就是为什么先并行初始化非主线程的 因为这部分时间会被利用上
|
||||
* * 2.3 等待所有并行初始化的job完成就结束了整个初始化过程
|
||||
*/
|
||||
private fun initDepends() {
|
||||
// 开启一个 Default Coroutine 进行初始化不会立即使用的第三方
|
||||
@ -65,31 +58,16 @@ open class BaseApplication : MultiDexApplication() {
|
||||
mLoadModuleProxy.initByBackstage()
|
||||
}
|
||||
|
||||
// 初始化需要被立即初始化的第三方 多线程并行,并阻塞至全部完成
|
||||
val measureTimeMillis = measureTimeMillis {
|
||||
mCoroutineScope.launch(Dispatchers.Main.immediate) {
|
||||
val depends = mLoadModuleProxy.initByFrontDesk()
|
||||
|
||||
// 1. 对非必须在主线程初始化的第三方依赖发起并行初始化
|
||||
// 并行job
|
||||
var jobs: MutableList<Deferred<String>>? = null
|
||||
if (depends.workerThreadDepends.isNotEmpty()) {
|
||||
jobs = mutableListOf()
|
||||
depends.workerThreadDepends.forEach {
|
||||
jobs.add(async(Dispatchers.Default) { it() })
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 对必须在主线程初始化的第三方依赖进行初始化
|
||||
if (depends.mainThreadDepends.isNotEmpty()) {
|
||||
depends.mainThreadDepends.forEach { it() }
|
||||
}
|
||||
|
||||
// 3. 等待每一个子线程初始化的依赖完成
|
||||
jobs?.forEach { it.await() }
|
||||
// 前台初始化
|
||||
val allTimeMillis = measureTimeMillis {
|
||||
val depends = mLoadModuleProxy.initByFrontDesk()
|
||||
var dependInfo: String
|
||||
depends.forEach {
|
||||
val dependTimeMillis = measureTimeMillis { dependInfo = it() }
|
||||
Log.d("BaseApplication", "initDepends: $dependInfo : $dependTimeMillis ms")
|
||||
}
|
||||
}
|
||||
Log.d("ApplicationInit", "初始化完成 $measureTimeMillis ms")
|
||||
Log.d("BaseApplication", "初始化完成 $allTimeMillis ms")
|
||||
}
|
||||
|
||||
override fun onTerminate() {
|
||||
|
||||
@ -30,11 +30,10 @@ interface ApplicationLifecycle {
|
||||
fun onTerminate(application: Application)
|
||||
|
||||
/**
|
||||
* 需要立即进行初始化的放在这里进行并行初始化
|
||||
* 需要必须在主线程初始化的放在[InitDepend.mainThreadDepends],反之放在[InitDepend.workerThreadDepends]
|
||||
* @return InitDepend 初始化方法集合
|
||||
* 主线程前台初始化
|
||||
* @return MutableList<() -> String> 初始化方法集合
|
||||
*/
|
||||
fun initByFrontDesk(): InitDepend
|
||||
fun initByFrontDesk(): MutableList<() -> String>
|
||||
|
||||
/**
|
||||
* 不需要立即初始化的放在这里进行后台初始化
|
||||
|
||||
@ -1,16 +0,0 @@
|
||||
package com.quyunshuo.androidbaseframemvvm.base.app
|
||||
|
||||
/**
|
||||
* 需要立即进行初始化的依赖列表 有的依赖可能必须要在主线程进行初始化,就放在[mainThreadDepends]里面就可以
|
||||
* 其余的非必须要在主线程进行初始化的放在[workerThreadDepends]里面,这部分依赖会被后台线程并行初始化
|
||||
*
|
||||
* @property mainThreadDepends MutableList<() -> String> 必须要在主线程初始化的依赖
|
||||
* @property workerThreadDepends MutableList<() -> String> 非必须要在主线程初始化的依赖
|
||||
*
|
||||
* @author Qu Yunshuo
|
||||
* @since 4/24/21 5:20 PM
|
||||
*/
|
||||
data class InitDepend(
|
||||
val mainThreadDepends: MutableList<() -> String>,
|
||||
val workerThreadDepends: MutableList<() -> String>
|
||||
)
|
||||
@ -45,18 +45,13 @@ class LoadModuleProxy : ApplicationLifecycle {
|
||||
}
|
||||
|
||||
/**
|
||||
* 需要立即进行初始化的放在这里进行并行初始化
|
||||
* 需要必须在主线程初始化的放在[InitDepend.mainThreadDepends],反之放在[InitDepend.workerThreadDepends]
|
||||
* @return InitDepend 初始化方法集合
|
||||
* 主线程前台初始化
|
||||
* @return MutableList<() -> String> 初始化方法集合
|
||||
*/
|
||||
override fun initByFrontDesk(): InitDepend {
|
||||
val mainThreadDepends: MutableList<() -> String> = mutableListOf()
|
||||
val workerThreadDepends: MutableList<() -> String> = mutableListOf()
|
||||
mLoader.forEach {
|
||||
mainThreadDepends.addAll(it.initByFrontDesk().mainThreadDepends)
|
||||
workerThreadDepends.addAll(it.initByFrontDesk().workerThreadDepends)
|
||||
}
|
||||
return InitDepend(mainThreadDepends, workerThreadDepends)
|
||||
override fun initByFrontDesk(): MutableList<() -> String> {
|
||||
val list: MutableList<() -> String> = mutableListOf()
|
||||
mLoader.forEach { list.addAll(it.initByFrontDesk()) }
|
||||
return list
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user