網(wǎng)站建設(shè)banner內(nèi)部?jī)?yōu)化
?一、jetpack startup
Android Jetpack Startup是一個(gè)庫(kù),它簡(jiǎn)化了Android應(yīng)用啟動(dòng)過(guò)程,尤其是對(duì)于那些需要處理復(fù)雜數(shù)據(jù)綁定和初始化邏輯的應(yīng)用。它的核心在于提供了一個(gè)
StartupComponent
,用于聲明應(yīng)用的初始化邏輯,這個(gè)邏輯會(huì)在首次啟動(dòng)時(shí)異步運(yùn)行,而不是直接在Application
的onCreate()
方法中。在傳統(tǒng)的
Application
中初始化,所有的代碼通常會(huì)放在onCreate()
或相關(guān)生命周期方法內(nèi),如onCreate()
,onRestoreInstanceState()
, 或者doSomethingOnCreate()
這樣的自定義方法中。這種做法可能導(dǎo)致UI阻塞,特別是當(dāng)初始化操作耗時(shí)時(shí),用戶體驗(yàn)可能會(huì)變差。Jetpack Startup的優(yōu)勢(shì)包括:
- 非阻塞:通過(guò)異步初始化,減輕了
onCreate()
的壓力,避免了主線程的阻塞,保證了更快的啟動(dòng)速度和更流暢的用戶界面。- 模塊化:將初始化邏輯分離到單獨(dú)的組件,使得代碼更加清晰,便于維護(hù)和測(cè)試。
- 可復(fù)用:
StartupComponent
可以被多個(gè)場(chǎng)景復(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開(kāi)始初始化==")CoroutineScope(Dispatchers.Main).launch {// 在IO線程中進(jìn)行耗時(shí)操作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(); // 沒(méi)有依賴,可以隨機(jī)執(zhí)行// 假設(shè)AsyncInitializer初始化器依賴于LogInitializer初始化器,需要讓LogInitializer先執(zhí)行
// return mutableListOf(LogInitializer::class.java)}private suspend fun loadData(): String {// 模擬耗時(shí)的加載數(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() // 沒(méi)有依賴,可以隨機(jī)執(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? (寫(xiě)在<application? 里面?)
<providerandroid:name="androidx.startup.InitializationProvider"android:authorities="${applicationId}.androidx-startup"android:exported="false"tools:node="merge"><!-- 順序是隨機(jī)的 --><meta-dataandroid:name="com.fslihua.initstartup.LogInitializer"android:value="androidx.startup" /><meta-dataandroid:name="com.fslihua.initstartup.AsyncInitializer"android:value="androidx.startup" />
<!--禁用單個(gè)庫(kù)就在meta-data中加入 tools:node="remove"
然后在需要的地方去手動(dòng)的初始化:
AsyncInitializer.getInstance(this)
.initializeComponent(AsyncInitializer::class.java) --></provider>
代碼下載地址:https://download.csdn.net/download/wy313622821/89955633
注意:
1、能放在子線程的初始化,就不要放到主線程
2、如果要依賴異步結(jié)果的初始化,A依賴B的異步結(jié)果,可以把AB放在同一個(gè)Initializer里面