refactor: 重构三方依赖初始化的逻辑

This commit is contained in:
Quyunshuo
2021-08-05 12:55:10 +08:00
parent 9e8863ea28
commit 1b9977ab3e
5 changed files with 26 additions and 73 deletions

View File

@ -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() {

View File

@ -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>
/**
* 不需要立即初始化的放在这里进行后台初始化

View File

@ -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>
)

View File

@ -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
}
/**

View File

@ -8,7 +8,6 @@ import com.alibaba.android.arouter.launcher.ARouter
import com.google.auto.service.AutoService
import com.quyunshuo.androidbaseframemvvm.base.app.ApplicationLifecycle
import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
import com.quyunshuo.androidbaseframemvvm.base.app.InitDepend
import com.quyunshuo.androidbaseframemvvm.base.constant.VersionStatus
import com.quyunshuo.androidbaseframemvvm.base.utils.ProcessUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.SpUtils
@ -54,21 +53,19 @@ class CommonApplication : ApplicationLifecycle {
override fun onTerminate(application: Application) {}
/**
* 需要立即进行初始化的放在这里进行并行初始化
* 需要必须在主线程初始化的放在[InitDepend.mainThreadDepends],反之放在[InitDepend.workerThreadDepends]
* @return InitDepend 初始化方法集合
* 主线程前台初始化
* @return MutableList<() -> String> 初始化方法集合
*/
override fun initByFrontDesk(): InitDepend {
val worker = mutableListOf<() -> String>()
val main = mutableListOf<() -> String>()
override fun initByFrontDesk(): MutableList<() -> String> {
val list = mutableListOf<() -> String>()
// 以下只需要在主进程当中初始化 按需要调整
if (ProcessUtils.isMainProcess(BaseApplication.context)) {
worker.add { initMMKV() }
worker.add { initARouter() }
main.add { initNetworkStateClient() }
list.add { initMMKV() }
list.add { initARouter() }
list.add { initNetworkStateClient() }
}
worker.add { initTencentBugly() }
return InitDepend(main, worker)
list.add { initTencentBugly() }
return list
}
/**