Android应用调度初始化流程优化方案

来源:互联网 发布:诺基亚java手机qq 编辑:程序博客网 时间:2024/06/09 22:53

Init帮助Android应用调度初始化流程,囊括类型、优先级、多进程,清理原来为每个进程判断是否要执行的神奇代码逻辑(你应该知道每个进程),提高应用启动效率。

尽管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大类型

  1. 阻塞task,即图中的蓝色任务。
  2. 异步task,又可以被分为
    • 完全异步或者横跨若干个wave后才需要阻塞,像图中的绿色task。
    • 异步链,像图中的红色task。

使用

dependencies {    compile 'cn.zhaiyifan:init:1.0.1'}
public class DemoApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        // Init需要应用context来获得进程相关信息        Init.init(this);        // 可以使用自定义的log离开输出Init的Log,logProxy需要实现cn.zhaiyifan.appinit.ILog接口        // Init.init(this, logProxy)        // 默认Task,延迟0,且阻塞下一波task的执行,参数字符串可以用来追踪任务执行状态        Task task1 = new Task("task1") {            @Override            protected void start() {                doSomeThing();            }            // 仅在返回true的时候才会在对应进程执行            @Override            public boolean runOnProcess(String processName) {                return processName.equals("cn.zhaiyifan.demo");            }        };        // 创建一个task,非阻塞,且延时300毫秒执行        Task task2 = new Task("task2", false, 300) {            @Override            protected void start() {                doSomeThing();            }        };        // 类似地,创建更多task,如task3、task4等等        // 创建一个有名flow        Flow flow = new Flow("flow");        // 往flow添加刚才创建的task, 第一个参数是wave序号,会从小到大执行每个wave的task        flow.addTask(1, task1).addTask(1, task2).addTask(2, task3).addTask(2, task4);        // 启动flow,开始初始化        Init.start(flow);    }

看一下log,可以发现原来一个串行执行需要2700毫秒的任务,在我们的安排下,现在只需要1307毫秒就可以结束。

10-04 18:53:54.789 646-666/cn.zhaiyifan.init I/Task: task2 runs 50010-04 18:53:55.289 646-665/cn.zhaiyifan.init I/Task: task1 runs 100010-04 18:53:55.591 646-741/cn.zhaiyifan.init I/Task: task3 runs 30010-04 18:53:55.592 646-646/cn.zhaiyifan.init I/Flow: flow runs 130710-04 18:53:55.990 646-740/cn.zhaiyifan.init I/Task: task4 runs 70010-04 18:53:56.191 646-783/cn.zhaiyifan.init I/Task: task5 runs 200

Useful api:

// 设置线程池大小Init.setThreadPoolSize(...)// 取消一个已经开始的flowInit.cancel(...)// 获得flow状态Init.getFlowStatus(...)// 获得特定的task状态flow.getTaskStatus(taskName)// 设置超时限制flow.setTimeout(5000)等等

github原文:可star追踪后续更加多的功能   https://github.com/markzhai/init


0 0
原创粉丝点击