Init 
Init帮助Android应用调度复杂的任务流(如应用初始化流程),如下一节图示的那种任务流,处理类型、优先级、多进程(像是每个进程都会执行application的onCreate),任务依赖,提高应用启动效率。
尽管Init设计的初衷是为了应用(application)初始化,但并不局限于此,它可以于应用在任何复杂的初始化流程。
Init不依赖于任何第三方库,使用Java concurrent并部分依赖于Android SDK(Context, Log),所以理论上也可以在简单修改后直接用于Java工程。
How
初始化流程被抽象为flow、wave和task。
flow是一个粗粒度概念,通常一个应用只有一个flow,但某些情况下我们可能拥有多个flow,像是patch flow,broadcast flow,fake UI flow等等,可以把它们都交给Init处理。
每个wave只有在上一wave的所有阻塞task完成后才能开始,而所有属于该wave的task会一起开始执行(除非被赋予了delay)。
至于task,在本库中属于原子性操作,他们可以被分为2大类型
- 阻塞task,即图中的蓝色任务。
- 异步task,又可以被分为
- 完全异步或者横跨若干个wave后才需要阻塞,像图中的绿色task。
- 异步链,像图中的红色task。
使用
1 | dependencies { |
1 | public class DemoApplication extends Application { |
看一下log,可以发现原来一个串行执行需要2700毫秒的任务,在我们的安排下,现在只需要1307毫秒就可以结束。1
2
3
4
5
610-04 18:53:54.789 646-666/cn.zhaiyifan.init I/Task: task2 runs 500
10-04 18:53:55.289 646-665/cn.zhaiyifan.init I/Task: task1 runs 1000
10-04 18:53:55.591 646-741/cn.zhaiyifan.init I/Task: task3 runs 300
10-04 18:53:55.592 646-646/cn.zhaiyifan.init I/Flow: flow runs 1307
10-04 18:53:55.990 646-740/cn.zhaiyifan.init I/Task: task4 runs 700
10-04 18:53:56.191 646-783/cn.zhaiyifan.init I/Task: task5 runs 200
Useful api:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 设置线程池大小
Init.setThreadPoolSize(...)
// 取消一个已经开始的flow
Init.cancel(...)
// 获得flow状态
Init.getFlowStatus(...)
// 获得特定的task状态
flow.getTaskStatus(taskName)
// 设置超时限制
flow.setTimeout(5000)
等等
更多详情请见demo工程。
为什么需要Init
想象一下我们是怎么去初始化一个大型应用像是支付宝、QQ、微信、空间等的,我们会面对像是下面这种代码:
1 | public class XXXApplication { |
你看到了当一个应用越来越大以后初始化能是一件多么复杂的事情,有些操作必须在另一个之后,而又有一些可以并行执行,又有的操作又需要在一个异步操作完成后才能执行……于是我们就得把每个独立的操作进行修改,有的改成异步,有的则阻塞在另一个操作后,使得代码杂乱且难以维护。
怎么可以使它变得简单呢?Init就是来帮助你做这个事的。
路线图
- 1.0 10月 - 一个实现上述概念的可运行库 已完成
- 1.1 2015年内 - 支持更复杂的初始化flow 进行中
- 2.0 或许明年 - 从使用本库的代码可以直接逆向出初始化flow的图
Contribute
任何贡献都是受欢迎的,你可以创建一个issue或者直接发一个pull请求。