Kotlin + Flow 實(shí)現(xiàn)Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)
特性
Kotlin + Flow 實(shí)現(xiàn)的 Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)。
- 支持模塊化,按模塊加載任務(wù)
- 可指定工作進(jìn)程名稱,main 表示僅在主進(jìn)程運(yùn)行,all 表示在所有進(jìn)程運(yùn)行,默認(rèn)值all
- 可指定任務(wù)僅在工作線程執(zhí)行
- 可指定任務(wù)僅在調(diào)試模式執(zhí)行
- 可指定任務(wù)在滿足合規(guī)條件后執(zhí)行
- 可指定任務(wù)優(yōu)先級(jí),決定同模塊內(nèi)無(wú)依賴同步任務(wù)的執(zhí)行順序
- 可指定依賴任務(wù)列表,能檢測(cè)循環(huán)依賴
- 使用 Flow 調(diào)度任務(wù)
- 僅200多行代碼,簡(jiǎn)單明了
- 有耗時(shí)統(tǒng)計(jì)
引入依賴
項(xiàng)目地址:github.com/czy1121/ini…
repositories { maven { url "https://gitee.com/ezy/repo/raw/android_public/"} } dependencies { implementation "me.reezy.init:init:0.9.0" kapt "me.reezy.init:init-compiler:0.9.0" // 使用 init-startup 代替 init 可以利用 Jetpack Startup 庫(kù)自動(dòng)初始化 // 無(wú)需在 Application.onCreate 調(diào)用 InitManager.init() implementation "me.reezy.init:init-startup:0.9.0" }
使用
在 AndroidManifest.xml 的 <application> 里添加模塊
<meta-data android:name="modules" android:value="app" />
通過(guò)注解 @Init 和 InitTask 接口定義一個(gè)任務(wù)
@Init class OneInit : InitTask { override fun execute(app: Application) { Log.e(TAG, "this is ${javaClass.simpleName} in ${Thread.currentThread().name}") } }
通過(guò)注解 @Init 的參數(shù)配置任務(wù)信息
@Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.SOURCE) annotation class Init( val process: String = "all", // 指定工作進(jìn)程名稱,main 表示僅在主進(jìn)程運(yùn)行,all 表示在所有進(jìn)程運(yùn)行 val background: Boolean = false, // 是否在工作線程執(zhí)行任務(wù) val debugOnly: Boolean = false, // 是否僅在 DEBUG 模式執(zhí)行任務(wù) val compliance: Boolean = false, // 是否需要合規(guī)執(zhí)行 val depends: Array<String> = [], // 依賴的任務(wù)列表 val priority: Short = 0 // )
APT會(huì)按模塊收集任務(wù)信息并生成任務(wù)加載器(InitLoader_$moduleName),任務(wù)加載器用于添加任務(wù)到TaskList
class Task( val name: String, // APT收集的任務(wù)名稱格式為 "$moduleName:${clazz.simpleName}" val background: Boolean = false, // 是否在工作線程執(zhí)行任務(wù) val priority: Int = 0, // 進(jìn)程運(yùn)行的優(yōu)先級(jí),值小的先執(zhí)行 val depends: Set<String> = setOf(), // 依賴的任務(wù)列表,同模塊只需指定"${clazz.simpleName}",跨模塊需要指定 "$moduleName:${clazz.simpleName}" val block: () -> Unit = {}, // 待執(zhí)行的任務(wù) ) { val children: MutableSet<Task> = mutableSetOf() // 子任務(wù)列表 }
核心類
- TaskList 負(fù)責(zé)持有和添加任務(wù)
- TaskManager 負(fù)責(zé)調(diào)度任務(wù),支持添加開關(guān)任務(wù)(沒(méi)有業(yè)務(wù)僅作為開關(guān),可手動(dòng)觸發(fā)完成,并償試執(zhí)行其子任務(wù))
無(wú)依賴的異步任務(wù),在子線程并行執(zhí)行
無(wú)依賴的同步任務(wù),在主線程順序執(zhí)行
有依賴的任務(wù),確保無(wú)循環(huán)依賴,且被依賴的任務(wù)先執(zhí)行
- InitManager 負(fù)責(zé)找到各模塊的任務(wù)加載器并開始啟動(dòng)初始化,它使用了一個(gè)合規(guī)開關(guān)來(lái)使相關(guān)任務(wù)在確定合規(guī)后執(zhí)行
可以不使用 InitManager 收集任務(wù)
val taskList = TaskList(app).apply { add("task1") { } add("task2", depends = setOf("t1")) { } add("task3", depends = setOf("task1")) { } } val manager = TaskManager(taskList, setOf("t1")) manager.start() // ... // 完成開關(guān)任務(wù)t1 manager.trigger("t1")
以上就是Kotlin + Flow 實(shí)現(xiàn)Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于實(shí)現(xiàn)Android 應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 自定義標(biāo)題欄的實(shí)例詳解
這篇文章主要介紹了 Android 自定義標(biāo)題欄的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-10-10Android入門之LinearLayout、AbsoluteLayout的用法實(shí)例講解
這篇文章主要介紹了Android入門之LinearLayout、AbsoluteLayout的用法,對(duì)于Android初學(xué)者有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-08-08Flutter底部導(dǎo)航欄的實(shí)現(xiàn)方式
這篇文章主要為大家詳細(xì)介紹了Flutter底部導(dǎo)航欄的實(shí)現(xiàn)方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Flutter模仿實(shí)現(xiàn)微信底部導(dǎo)航欄流程詳解
這篇文章主要介紹了Flutter模仿實(shí)現(xiàn)微信底部導(dǎo)航欄流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-05-05Android Socket實(shí)現(xiàn)多個(gè)客戶端即時(shí)通信聊天
這篇文章主要為大家詳細(xì)介紹了Android Socket實(shí)現(xiàn)多個(gè)客戶端即時(shí)通信聊天,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04