網(wǎng)站建設(shè)banner內(nèi)部優(yōu)化
?一、jetpack startup
Android Jetpack Startup是一個庫,它簡化了Android應(yīng)用啟動過程,尤其是對于那些需要處理復(fù)雜數(shù)據(jù)綁定和初始化邏輯的應(yīng)用。它的核心在于提供了一個
StartupComponent
,用于聲明應(yīng)用的初始化邏輯,這個邏輯會在首次啟動時異步運行,而不是直接在Application
的onCreate()
方法中。在傳統(tǒng)的
Application
中初始化,所有的代碼通常會放在onCreate()
或相關(guān)生命周期方法內(nèi),如onCreate()
,onRestoreInstanceState()
, 或者doSomethingOnCreate()
這樣的自定義方法中。這種做法可能導(dǎo)致UI阻塞,特別是當初始化操作耗時時,用戶體驗可能會變差。Jetpack Startup的優(yōu)勢包括:
- 非阻塞:通過異步初始化,減輕了
onCreate()
的壓力,避免了主線程的阻塞,保證了更快的啟動速度和更流暢的用戶界面。- 模塊化:將初始化邏輯分離到單獨的組件,使得代碼更加清晰,便于維護和測試。
- 可復(fù)用:
StartupComponent
可以被多個場景復(fù)用,比如數(shù)據(jù)加載、配置設(shè)置等。
依賴導(dǎo)入:
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) {// 這里執(zhí)行你的異步初始化代碼val data = loadData()Log.e("TAG", "異步獲取到的結(jié)果為:$data") // 子線程打印異步獲取到的結(jié)果}}return "AsyncInitializer"}override fun dependencies(): MutableList<Class<out Initializer<*>>> {return Collections.emptyList(); // 沒有依賴,可以隨機執(zhí)行// 假設(shè)AsyncInitializer初始化器依賴于LogInitializer初始化器,需要讓LogInitializer先執(zhí)行
// return mutableListOf(LogInitializer::class.java)}private suspend fun loadData(): String {// 模擬耗時的加載數(shù)據(jù)操作,比如從網(wǎng)絡(luò)獲取數(shù)據(jù)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() // 沒有依賴,可以隨機執(zhí)行}
}
LogUtil類
class LogUtil private constructor() {companion object {@Volatileprivate var instance: LogUtil? = nullfun 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? 里面?)
<providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge"><!-- 順序是隨機的 --><meta-dataandroid:name="com.fslihua.initstartup.LogInitializer"android:value="androidx.startup" /><meta-dataandroid: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、如果要依賴異步結(jié)果的初始化,A依賴B的異步結(jié)果,可以把AB放在同一個Initializer里面