溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kotlin+Flow實(shí)現(xiàn)Android應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)的方法

發(fā)布時(shí)間:2021-03-29 10:49:53 來(lái)源:億速云 閱讀:241 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Kotlin+Flow實(shí)現(xiàn)Android應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

特性

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ù),支持添加開(kāi)關(guān)任務(wù)(沒(méi)有業(yè)務(wù)僅作為開(kāi)關(guān),可手動(dòng)觸發(fā)完成,并償試執(zhí)行其子任務(wù))

無(wú)依賴的異步任務(wù),在子線程并行執(zhí)行
無(wú)依賴的同步任務(wù),在主線程順序執(zhí)行
有依賴的任務(wù),確保無(wú)循環(huán)依賴,且被依賴的任務(wù)先執(zhí)行

  • InitManager 負(fù)責(zé)找到各模塊的任務(wù)加載器并開(kāi)始啟動(dòng)初始化,它使用了一個(gè)合規(guī)開(kāi)關(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()

// ...

// 完成開(kāi)關(guān)任務(wù)t1
manager.trigger("t1")

關(guān)于“Kotlin+Flow實(shí)現(xiàn)Android應(yīng)用初始化任務(wù)啟動(dòng)庫(kù)的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI