android——jetpack startup初始化框架
一、jetpack startup
Android Jetpack Startup是一个库,它简化了Android应用启动过程,尤其是对于那些需要处理复杂数据绑定和初始化逻辑的应用。它的核心在于提供了一个
StartupComponent
,用于声明应用的初始化逻辑,这个逻辑会在首次启动时异步运行,而不是直接在Application
的onCreate()
方法中。在传统的
Application
中初始化,所有的代码通常会放在onCreate()
或相关生命周期方法内,如onCreate()
,onRestoreInstanceState()
, 或者doSomethingOnCreate()
这样的自定义方法中。这种做法可能导致UI阻塞,特别是当初始化操作耗时时,用户体验可能会变差。Jetpack Startup的优势包括:
- 非阻塞:通过异步初始化,减轻了
onCreate()
的压力,避免了主线程的阻塞,保证了更快的启动速度和更流畅的用户界面。- 模块化:将初始化逻辑分离到单独的组件,使得代码更加清晰,便于维护和测试。
- 可复用:
StartupComponent
可以被多个场景复用,比如数据加载、配置设置等。
依赖导入:
dependencies {
implementation "androidx.startup:startup-runtime:1.1.1"
}
示例如下:
AsyncInitializer 类
class AsyncInitializer : Initializer<String> {
override fun create(context: Context): String {
Log.e("TAG", "==AsyncInitializer开始初始化==")
CoroutineScope(Dispatchers.Main).launch {
// 在IO线程中进行耗时操作
val result = withContext(Dispatchers.IO) {
// 这里执行你的异步初始化代码
val data = loadData()
Log.e("TAG", "异步获取到的结果为:$data") // 子线程打印异步获取到的结果
}
}
return "AsyncInitializer"
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> {
return Collections.emptyList(); // 没有依赖,可以随机执行
// 假设AsyncInitializer初始化器依赖于LogInitializer初始化器,需要让LogInitializer先执行
// return mutableListOf(LogInitializer::class.java)
}
private suspend fun loadData(): String {
// 模拟耗时的加载数据操作,比如从网络获取数据
delay(3000)
return "Loaded Data"
}
}
LogInitializer类
class LogInitializer : Initializer<LogUtil> {
override fun create(context: Context): LogUtil {
LogUtil.init(context)
return LogUtil.getInstance()
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> {
return Collections.emptyList() // 没有依赖,可以随机执行
}
}
LogUtil类
class LogUtil private constructor() {
companion object {
@Volatile
private var instance: LogUtil? = null
fun getInstance(): LogUtil {
if (instance == null) {
synchronized(LogUtil::class.java) {
if (instance == null) {
instance = LogUtil()
}
}
}
return instance!!
}
fun init(context: Context) {
Log.e("TAG", "==init log==")
}
}
}
AndroidManifest.xml (写在<application 里面 )
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<!-- 顺序是随机的 -->
<meta-data
android:name="com.fslihua.initstartup.LogInitializer"
android:value="androidx.startup" />
<meta-data
android:name="com.fslihua.initstartup.AsyncInitializer"
android:value="androidx.startup" />
<!--禁用单个库就在meta-data中加入 tools:node="remove"
然后在需要的地方去手动的初始化:
AsyncInitializer.getInstance(this)
.initializeComponent(AsyncInitializer::class.java) -->
</provider>
代码下载地址:https://download.csdn.net/download/wy313622821/89955633
注意:
1、能放在子线程的初始化,就不要放到主线程
2、如果要依赖异步结果的初始化,A依赖B的异步结果,可以把AB放在同一个Initializer里面