alpha

Project Url: alibaba/alpha
Introduction: Alpha 是一个基于 PERT 图构建的 Android 异步启动框架,它简单,高效,功能完善。 在应用启动的时候,我们通常会有很多工作需要做,为了提高启动速度,我们会尽可能让这些工作并发进行。但这些工作之间可能存在前后依赖的关系,所以我们又需要想办法保证他们执行顺序的正确性。Alpha 就是为此而设计的,使用者只需定义好自己的 task,并描述它依赖的 task,将它添加到 Project 中。框架会自动并发有序地执行这些 task,并将执行的结果抛出来。
More: Author   ReportBugs   
Tags:

screenshot


Alpha 是一个基于 PERT 图构建的 Android 异步启动框架,它简单,高效,功能完善。
在应用启动的时候,我们通常会有很多工作需要做,为了提高启动速度,我们会尽可能让这些工作并发进行。但这些工作之间可能存在前后依赖的关系,所以我们又需要想办法保证他们执行顺序的正确性。Alpha 就是为此而设计的,使用者只需定义好自己的 task,并描述它依赖的 task,将它添加到 Project 中。框架会自动并发有序地执行这些 task,并将执行的结果抛出来。
由于 Android 应用支持多进程,所以 Alpha 支持为不同进程配置不同的启动模式。

接入 Alpha

compile 'com.alibaba.android:alpha:1.0.0.1@aar'

使用指南

Alpha 支持代码和配置文件的方式构建一个启动流程。

使用 Java 代码构建

1.实现自己的 Task 类。继承 Task 类,在 run()函数中实现该 Task 需要做的事情。

    public class SampleTask extends Task{
        public SampleTask() {
            super("SampleTask");
        }

        @Override
        public void run() {
            //do something, print a msg for example.
            Log.d(TAG, "run SampleTask");
        }
    }

Task 默认是在异步线程中执行的,如果这个 Task 需要在线程中执行,可以在构造函数中声明。
2.将 Task 组合成一个完整的 Project。
可以用 Task.ProjectBuilder 依据各 Task 之间的依赖关系,将这些 Task 构建成一个完整的 Project。

        private Task createCommonTaskGroup() {
        Task a = new TaskA();
        Task b = new TaskB();
        Task c = new TaskC();
        Task d = new TaskD();
        Task e = new TaskE();

        Project.Builder builder = new Project.Builder();
        builder.add(a);
        builder.add(b).after(a);
        builder.add(c).after(a);
        builder.add(d).after(b, c);
        builder.add(e).after(a);
        Project group = builder.create();

        return group;
    }

ProjectBuilder 生成的 Project 本身可以作为一个 Task 嵌入到另外一个 Project 中。

    private Task createCommonTaskGroup() {
        Task a = new TaskA();
        Task b = new TaskB();
        Task c = new TaskC();
        Task d = new TaskD();
        Task e = new TaskE();

        Project.Builder builder = new Project.Builder();
        builder.add(a);
        builder.add(b).after(a);
        builder.add(c).after(a);
        builder.add(d).after(b, c);
        builder.add(e).after(a);
        Project group = builder.create();

        return group;
    }

    private void createProject() {
        Task group = createCommonTaskGroup();
        Task f = new TaskF();

        Project.Builder builder = new Project.Builder();
        builder.add(group);
        builder.add(f);

        Project project = builder.create();
    }

3.为构建完成的 Project 配置对应的进程。

AlphaManager.getInstance(mContext).addProject(project);

4.执行启动流程

AlphaManager.getInstance(mContext).start();

使用 XML 配置文件构建

1.在代码中实现自己的 Task,这个和上面的一样。 2.在 XML 文件中描述整个 Project。

<projects>
    <project
            mode="mainProcess">
        <task
                name="TaskA"
                class="com.wireless.wireless.alpha.ConfigTest$TaskA"
                executePriority="8"
                mainThread="true"/>

        <task
                name="TaskB"
                class="com.wireless.wireless.alpha.ConfigTest$TaskB"
                predecessor="TaskA"/>

        <task
                name="TaskC"
                class="com.wireless.wireless.alpha.ConfigTest$TaskC"
                executePriority="4"
                predecessor="TaskA"/>

        <task
                name="TaskD"
                class="com.wireless.wireless.alpha.ConfigTest$TaskD"
                threadPriority="-5"
                predecessor="TaskB,TaskC"/>

        <task
                name="TaskE"
                class="com.wireless.wireless.alpha.ConfigTest$TaskE"/>

        <!--<task-->
                <!--name="TaskE"-->
                <!--class="com.wireless.koalainitializer.ConfigTest$TaskE"/>-->

        <task
                name="TaskF"
                class="com.wireless.wireless.alpha.ConfigTest$TaskF"
                mainThread="true"
                predecessor="TaskC"/>

        <task
                name="TaskG"
                class="com.wireless.wireless.alpha.ConfigTest$TaskG"
                threadPriority="-5"
                predecessor="TaskC"/>

    </project>



    <project
            mode="secondaryProcess">
        <task
                name="TaskA"
                class="com.wireless.wireless.alpha.ConfigTest$TaskA"
                mainThread="true"/>

        <task
                name="TaskB"
                class="com.wireless.wireless.alpha.ConfigTest$TaskB"
                predecessor="TaskA"/>

        <task
                name="TaskC"
                class="com.wireless.wireless.alpha.ConfigTest$TaskC"
                executePriority="8"
                predecessor="TaskA"/>

        <task
                name="TaskD"
                class="com.wireless.wireless.alpha.ConfigTest$TaskD"
                predecessor="TaskB,TaskC"/>


    </project>
</projects>

3.加载配置文件,这里我将该配置文件命名为 tasklist.xml,并且放在 asset 中。

        InputStream in = null;
        try {

            in = mContext.getAssets().open("tasklist.xml");
            AlphaManager.getInstance(mContext).addProjectsViaFile(in);

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            AlphaUtils.closeSafely(in);
        }

4.执行启动流程

AlphaManager.getInstance(mContext).start();
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools