Rocket

Project Url: Kyson/Rocket
Introduction: Android 启动任务调度框架,用于缩短 app 启动时间
More: Author   ReportBugs   
Tags:

Rocket


Android 启动任务调度框架,用于缩短 app 启动时间

STEP0

引入依赖,使用 gradle

dependencies {
  implementation 'cn.hikyson.rocket:rocket-core:VERSION_NAME'
}

STEP1

定义某一个任务:

public class TestTask1 extends LaunchTask {
    @NonNull
    @Override
    public String taskName() {
        //任务名称,默认使用类名
        return "test1";
    }


    @Override
    public void run() throws Throwable {
        //执行的任务
        Thread.sleep(6000);
    }

    @NonNull
    @Override
    public List<String> dependsOn() {
        //依赖的其他任务
        return Collections.emptyList();
    }

    @NonNull
    @Override
    public Executor runOn() {
        //执行的线程,默认执行在 rocket 自带的适合大部分 app 的线程池中
        return Execs.io;
    }

    @Override
    public int priority() {
        //线程优先级,默认 Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE
        return super.priority() + Process.THREAD_PRIORITY_MORE_FAVORABLE;
    }

    @Override
    public void beforeWait() {
        //任务分为三个阶段:wait -> run -> done 
        //任务处于等待状态的回调
        super.beforeWait();
    }

    @Override
    public void beforeRun() {
        //任务分为三个阶段:wait -> run -> done 
        //任务处于运行状态的回调
        super.beforeRun();
    }

    @Override
    public void onTaskDone(TaskRecord taskRecord) {
        //任务分为三个阶段:wait -> run -> done 
        //任务处于运行完成状态的回调,TaskRecord 记录了任务的执行时间等信息
        super.onTaskDone(taskRecord);
    }
}

任务的每个接口表示含义见注释。

STEP2

所有 API 均由 Rocket 类提供

注册任务有两种方式:

  1. public synchronized Rocket from(Application application, final List<LaunchTask> conditionTasks)接口直接传入直接定义的任务列表
  2. public synchronized Rocket from(Application application, String assetFile),从 assets 文件中实例化任务列表,具体方式:

在应用 assets 目录下创建任务列表的 xml 格式文件,文件根节点为 task-list,任务节点名为 task,比如在 assets 下创建 rocket 文件夹,并在此创建 task_list.xml 文件,文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<task-list>
    <task name="test1">cn.hikyson.rocket.sample.TestTask1</task>
    <task name="test2">cn.hikyson.rocket.sample.TestTask2</task>
    <task name="test3">cn.hikyson.rocket.sample.TestTask3</task>
    <task name="test4">cn.hikyson.rocket.sample.TestTask4</task>
    <task name="test5">cn.hikyson.rocket.sample.TestTask5</task>
</task-list>

name 属性可写可不写,仅仅做个声明,如果声明了,那么必须和 taskName()保持一致。

STEP3

在 application 中开始 Rocket:

Rocket.get().tailTask(new ITailTask() {
                @Nullable
                @Override
                public String taskName() {
                    return TailTask.class.getSimpleName();
                }

                @NonNull
                @Override
                public Executor runOn() {
                    return cn.hikyson.rocket.util.Execs.io();
                }

                @Override
                public void beforeWait() {
                }

                @Override
                public void beforeRun() {
                }

                @Override
                public void onTaskDone(TaskRecord taskRecord) {
                }
            }).tasksFinishCallback(new ITasksFinishCallback() {
                              @Override
                              public void onTasksFinished() {
                                  L.d("onTasksFinished.");
                              }
                          })
            .timeoutHandler(10000, new ITimeoutHandler() {
                @Override
                public void onTimeout(List<LaunchTask> timeoutTasks) {
                    L.d("onTimeout: " + String.valueOf(timeoutTasks));
                }
            }).errorHandler(new IErrorHandler() {
                @Override
                public void onError(LaunchTask task, Throwable e) {
                    L.d("onError: " + String.valueOf(task) + ", " + String.valueOf(e));
                }
            }).from(getApplication(), "rocket/task_list.xml").launch();
  • tasksFinishCallback 接口为所有的任务结束回调
  • 如果调用了 tailTask 接口,Rocket 会在任务列表结尾添加 TailTask 任务,如果你希望任务 M 在所有任务结束之后再执行,那么可以调用这个接口并且声明 M 任务依赖这个 TailTask。
  • timeoutHandler 用于超时回调,Rocket 会检测所有的任务执行状态,如果达到了超时时间且部分任务没有完成就会回调这个方法,并返回未完成的任务列表
  • errorHandler 用于错误回调,如果有些任务发生异常则回调此方法
  • from 接口声明 Rocket 从哪里读取任务列表,比如读取 STEP2 创建的 assets 目录下的任务列表文件
  • 最后调用 launch 开始执行任务

STEP4

如果首页需要等待某几个必要任务执行完毕才能开始使用,可以使用public static void ensureTasks(String... taskNames)接口,这个接口后的代码会一直等待直到任务完成才能执行。

更便捷的做法:在 Activity 上声明RocketDependency注解

//页面依赖 test2 的任务
@RocketDependency({"test2"})
public class SecondActivity extends AbsActivity {
}

详细说明

Rocket-Android 启动任务调度框架

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools