很简单,主要做的是:
1.根据dependsOn() 定义一个栅栏
很好理解,传入的task(我们的耗时任务),因为需要依赖,比如TaskA,必须得等TaskB,TaskC加载完毕才能加载TaskA,那么dependsOn()返回的就是TaskB,TaskC,也就是在TaskA中加了几个同步锁(锁的数量就是TaskA所需要依赖的Task数量),每次执行satisfy()就减少一把锁。
3.实现启动器
外部调用
TaskDispatcher instance = TaskDispatcher.createInstance();
instance.addTask(new InitBuglyTask()) // 默认添加,并发处理
.addTask(new InitBaiduMapTask()) // 在这里需要先处理了另外一个耗时任务initShareSDK,才能再处理它
.addTask(new InitJPushTask()) // 等待主线程处理完毕,再进行执行
.start();
instance.await();
构建启动器
public class TaskDispatcher {
private static Context mContext;
private static boolean sHasInit;
private static boolean sIsMainProcess;
// 存放依赖
private HashMap<Class<? extends Task>, ArrayList> mDependedHashMap = new HashMap<>();
// 存放所有的task
private List mAllTasks = new ArrayList<>();
private List<Class<? extends Task>> mClsAllTasks = new ArrayList<>();
// 调用了await的时候还没结束的且需要等待的Task队列
private List mNeedWaitTasks = new ArrayList<>();
// 已经结束了的Task队列
private volatile List<Class<? extends Task>> mFinishedTasks = new ArrayList<>(100);
// 需要在主线程中执行的Task队列
private volatile List mMainThreadTasks = new ArrayList<>();
// 保存需要Wait的Task的数量
private AtomicInteger mNeedWaitCount = new AtomicInteger();
private CountDownLatch mCountDownLatch;
/**
- 注意:每次获取的都是新对象
*/
public static TaskDispatcher getInstance(Context context) {
if (context != null) {
mContext = context;
sHasInit = true;
sIsMainProcess = Utils.isMainProcess(mContext);
}
retur