EasyLaunch
Introduction: Android 的协程轻量级启动框架, 支持配置有向无环图优化启动流程
Tags:

这是一个 Android 的启动开源框架, 用于在启动过程中将任务并行, 达到优化启动速度的目的.
框架特点:
- 使用有向无环图配置任务依赖关系, 并支持检查当前任务是否成环
- 支持 main 线程, 子线程同步初始化
- 使用协程实现, 轻量级
- 支持任务依赖的延迟解析,可以任意顺序添加任务
- 支持任务完成监听,可以在特定任务完成后执行特定操作
执行效果
如项目中 app 的配置方案执行: TaskA (执行递归 fibonacci(40)模拟阻塞耗时操作), 异步, 无依赖 TaskB (执行 Thread.sleep(300)), 异步, 无依赖 TaskC (执行 delay(200)), 异步, 依赖 B TaskD (执行 delay(100)), 同步主线程, 依赖 A, C
可以看到日志后方总结: 所有任务总时长是 1343, 但是实际执行时长是 1051. 因为任务 A,B 时并行执行的
启动任务已添加并开始执行
Application.onCreate() 继续执行
开始执行启动任务
开始执行任务: TaskA
开始执行任务: TaskB
TaskA 开始执行
TaskB 开始执行
任务执行完成: TaskB, 执行时长: 302ms, 开始总时长: 310ms
MainActivity onCreate:
任务执行完成: TaskA, 执行时长: 739ms, 开始总时长: 746ms
开始执行任务: TaskC
TaskC 开始执行
任务执行完成: TaskC, 执行时长: 201ms, 开始总时长: 948ms
开始执行任务: TaskD
TaskD 开始执行(主线程)
任务执行完成: TaskD, 执行时长: 101ms, 开始总时长: 1050ms
======== 任务执行时间统计 ========
所有任务合并执行时长: 1051ms
所有任务总时长: 1343ms
各任务执行时间:
1. TaskA: 739ms (55.0%)
2. TaskB: 302ms (22.5%)
3. TaskC: 201ms (15.0%)
4. TaskD: 101ms (7.5%)
================================
所有启动任务执行完成
使用方法
1. 添加依赖
在项目的根目录的 build.gradle 中添加 JitPack 仓库:
allprojects {
repositories {
// ...
maven { url 'https://jitpack.io' }
}
}
在应用模块的 build.gradle 中添加依赖:
dependencies {
implementation 'com.github.aidaole:EasyLaunch:[最新版本]'
}
2. 创建启动任务
创建启动任务需要实现Task
接口:
class YourTask : Task {
// 任务名称
override val name: String
get() = "YourTask"
// 任务依赖,表示当前任务依赖的其他任务
override val dependencies: List<Class<out Task>>
get() = listOf(OtherTask::class.java)
// 是否是异步任务
override val isAsync: Boolean
get() = true
// 任务执行方法
override suspend fun execute() {
// 在此处实现任务的具体逻辑
}
}
3. 在 Application 中初始化
在 Application 的 onCreate 方法中初始化 EasyLaunch:
class YourApplication : Application() {
override fun onCreate() {
super.onCreate()
// 初始化 EasyLaunch
EasyLaunch.getInstance().init(this)
// 添加任务 - 可以任意顺序添加
EasyLaunch.getInstance()
.addTask(TaskD()) // 依赖 TaskB 和 TaskC
.addTask(TaskB()) // 依赖 TaskA
.addTask(TaskC()) // 依赖 TaskA
.addTask(TaskA()) // 没有依赖
.start()
}
}
4. 等待任务完成
如果需要等待某些任务完成后再执行某些操作,可以使用任务完成监听:
// 监听单个任务完成
EasyLaunch.getInstance()
.addTaskCompletedListener(TaskB::class.java) {
// 当 TaskB 完成时执行
Log.d("Sample", "TaskB 已完成,可以执行特定操作")
}
.start()
// 监听多个任务完成
EasyLaunch.getInstance()
.addTasksCompletedListener(listOf(TaskB::class.java, TaskC::class.java)) {
// 当 TaskB 和 TaskC 都完成时执行
Log.d("Sample", "TaskB 和 TaskC 都已完成,可以执行特定操作")
}
.start()
// 监听所有任务完成
EasyLaunch.getInstance()
.addAllTasksCompletedListener {
// 当所有任务完成时执行
Log.d("Sample", "所有任务已完成,可以跳转到主界面")
startActivity(Intent(this, MainActivity::class.java))
finish()
}
.start()
更多详细信息请查看 EasyLaunch 模块 README。