Coder Social home page Coder Social logo

alibaba / alpha Goto Github PK

View Code? Open in Web Editor NEW
1.9K 63.0 225.0 1004 KB

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

HTML 67.89% CSS 3.42% Java 28.69%
android

alpha's Introduction

screenshot

Alpha启动框架


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();

alpha's People

Contributors

zhangsl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alpha's Issues

gradle引入失败

gradle通过 implementation 'com.alibaba.android:alpha:1.0.0.1@aar' 引入失败,无法同步代码,提示:ERROR: Failed to resolve: com.alibaba.android:alpha:1.0.0.1
请问是方法不对吗?

SplashActivity执行耗时任务

SplashActivity执行耗时任务,有传SplashActivity的上下文对象到task

如果SplashActivity销毁了,但是task里的任务还没执行完,会怎样?

通过读取“/proc/${pid}/cmdline” 获取的进程的名称不准确

举个例子:
PackageName:com.example.hello

通过“/proc/${pid}/cmdline” 获取的进程名称为:com.example.hello������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

获取应用下的其他进程也是这样:
com.example.hello:channel�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������

通过ActivityManager的RunProcesses可以获取到正确的进程名称
com.example.hello
com.example.hello:channel

Handle exception when there is a cycle

There is no cycle in theory but we have to handle exceptions like below which cause cycle in graph.

builder.add(TASK_B).after(TASK_A);
builder.add(TASK_A).after(TASK_B);

This will cause alpha never ends.

I think its a good idea to add a Validator to detect if graph is valid before execution.

怎样设置在所有的初始化任务都完成后,再结束Application.onCreate()?

假设我有一个初始化要比较耗时,比如读取一个很大的配置文件,它要耗时2秒,读取文件可以用Task异步执行,
但这个配置文件很重要,项目里到处都要用到,
alpha有没有办法做到,在Application.onCreate()里初始化读取配置文件,此时把主线程挂起,直到任务完成后,再恢复主线程,Application.onCreate()执行完成,继续下一步,进入主页?

如果自己要做这个需求,只能是在Application.onCreate()里直接调用方法,同步执行,
感觉这种操作不适合做异步,
就是想问问,alpha框架有没有办法完成这样的需求。

This repository is empty.

Alpha是一个基于PERT图构建的Android异步启动框架,它简单,高效,功能完善。 在应用启动的时候,我们通常会有很多工作需要做,为了提高启动速度,我们会尽可能让这些工作并发进行。但这些工作之间可能存在前后依赖的关系,所以我们又…

关于 OnTaskFinishListener 执行时刻疑惑

我看到 Task 中,对于OnTaskFinishListener的执行是如下条件进行的。

void notifyFinished() {
    if (!mSuccessorList.isEmpty()) {
        AlphaUtils.sort(mSuccessorList);

        for (Task task : mSuccessorList) {
            task.onPredecessorFinished(this);
        }
    }

    if (!mTaskFinishListeners.isEmpty()) {
        for (OnTaskFinishListener listener : mTaskFinishListeners) {
            listener.onTaskFinish(mName);
        }
        mTaskFinishListeners.clear();
    }
}

这是否会造成后一个Task 已经被执行了,才调用前一个 Task的回调?我的理解,通常业务在使用这个回调时,应该是需要为后一个 Task 赋值某些执行条件,如果是这样,不知道这么做的出发点是什么?

关于框架的设计的一些疑惑。

运行了sample和阅读了框架源码之后发现,如果task是运行是主线程的,通过handler post出去,虽然是在主线程初始化,但是如果这类代码在application里面运行,则会因为图的首节点AnchorTask在异步执行之后切回主线程运行,会丢失了“阻塞”效果。 如果有一些初始化功能需要在onCreate进行,在首个activity之前完成初始化,则框架不适用了。对此,想请教下:

  1. 是否支持为用户暴露api支持自己定义AnchorTask的线程场景;
    2.AnchorTask 只是为了做一些project状态的回调,运行在独立的线程是否有些浪费。
    谢谢。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.