91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin+Flow實現Android應用初始化任務啟動庫的方法

發布時間:2021-03-29 10:49:53 來源:億速云 閱讀:246 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Kotlin+Flow實現Android應用初始化任務啟動庫的方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

特性

Kotlin + Flow 實現的 Android 應用初始化任務啟動庫。

  • 支持模塊化,按模塊加載任務

  • 可指定工作進程名稱,main 表示僅在主進程運行,all 表示在所有進程運行,默認值all

  • 可指定任務僅在工作線程執行

  • 可指定任務僅在調試模式執行

  • 可指定任務在滿足合規條件后執行

  • 可指定任務優先級,決定同模塊內無依賴同步任務的執行順序

  • 可指定依賴任務列表,能檢測循環依賴

  • 使用 Flow 調度任務

  • 僅200多行代碼,簡單明了

  • 有耗時統計

引入依賴

項目地址: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 庫自動初始化
  // 無需在 Application.onCreate 調用 InitManager.init()
  implementation "me.reezy.init:init-startup:0.9.0" 
}

使用

在 AndroidManifest.xml 的 <application> 里添加模塊

<meta-data android:name="modules" android:value="app" />

通過注解 @Init 和 InitTask 接口定義一個任務

@Init
class OneInit : InitTask {
  override fun execute(app: Application) {
    Log.e(TAG, "this is ${javaClass.simpleName} in ${Thread.currentThread().name}")
  }
}

通過注解 @Init 的參數配置任務信息

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class Init(
  val process: String = "all",    // 指定工作進程名稱,main 表示僅在主進程運行,all 表示在所有進程運行
  val background: Boolean = false,  // 是否在工作線程執行任務
  val debugOnly: Boolean = false,   // 是否僅在 DEBUG 模式執行任務
  val compliance: Boolean = false,  // 是否需要合規執行
  val depends: Array<String> = [],  // 依賴的任務列表
  val priority: Short = 0       // 
)

APT會按模塊收集任務信息并生成任務加載器(InitLoader_$moduleName),任務加載器用于添加任務到TaskList

class Task(
  val name: String,          // APT收集的任務名稱格式為 "$moduleName:${clazz.simpleName}"
  val background: Boolean = false,  // 是否在工作線程執行任務
  val priority: Int = 0,       // 進程運行的優先級,值小的先執行
  val depends: Set<String> = setOf(), // 依賴的任務列表,同模塊只需指定"${clazz.simpleName}",跨模塊需要指定 "$moduleName:${clazz.simpleName}"
  val block: () -> Unit = {},     // 待執行的任務
) {
  val children: MutableSet<Task> = mutableSetOf() // 子任務列表
}

核心類

  • TaskList 負責持有和添加任務

  • TaskManager 負責調度任務,支持添加開關任務(沒有業務僅作為開關,可手動觸發完成,并償試執行其子任務)

無依賴的異步任務,在子線程并行執行
無依賴的同步任務,在主線程順序執行
有依賴的任務,確保無循環依賴,且被依賴的任務先執行

  • InitManager 負責找到各模塊的任務加載器并開始啟動初始化,它使用了一個合規開關來使相關任務在確定合規后執行

可以不使用 InitManager 收集任務

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()

// ...

// 完成開關任務t1
manager.trigger("t1")

關于“Kotlin+Flow實現Android應用初始化任務啟動庫的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙湾县| 大悟县| 鞍山市| 商洛市| 修水县| 娄底市| 高台县| 北川| 华池县| 长阳| 双桥区| 柳江县| 阳信县| 阿荣旗| 嘉黎县| 永丰县| 镇沅| 郓城县| 玉树县| 沛县| 台北市| 石门县| 澎湖县| 五家渠市| 贺州市| 建平县| 黄冈市| 当阳市| 松阳县| 丹棱县| 大埔区| 牡丹江市| 望江县| 嘉祥县| 阳西县| 德庆县| 泸州市| 固阳县| 呼图壁县| 阿克陶县| 广东省|