revocable.revoke();
HiLog.info(label, "after async task1");
}
在运行一下:
![](https://img-blog.csdnimg.cn/img_convert/2f96bc8ba07993c28f1a0834a7a732db.webp?x-oss-process=image/format,png)
很明显里面的任务已经撤销了
#### ⑦ 异步延迟派发任务(delayDispatch)
异步延迟派发任务:异步执行,函数立即返回,内部会在延时指定时间后将任务派发到相应队列中。延时时间参数仅代表在这段时间以后任务分发器会将任务加入到队列中,任务的实际执行时间可能晚于这个时间。具体比这个数值晚多久,取决于队列及内部线程池的繁忙情况。下面用代码演示一下:
/** * 当前时间 */
final long currentTime = System.currentTimeMillis(); /** * 延迟时间 100ms */
final long delayTime = 100;
![](https://img-blog.csdnimg.cn/img_convert/3b966d23478ea1f55baf307dc58987ab.webp?x-oss-process=image/format,png)
delayTask方法如下:
/** * GlobalTaskDispatcher 派发异步延时任务 */
private void delayTask() {
globalTaskDispatcher.delayDispatch(new Runnable() {
@Override public void run() {
HiLog.info(label, “delay task1 run”);
final long actualDelayMs = System.currentTimeMillis() - currentTime; HiLog.info(label,"actualDelayTime >= delayTime : " + (actualDelayMs >= delayTime));
}
},delayTime); HiLog.info(label, “after delay task1”);
}
日志如下:
![](https://img-blog.csdnimg.cn/img_convert/0f8683fb9f43d1bf5dd24a8f9d7d0759.webp?x-oss-process=image/format,png)
#### ⑧ 任务组(Group)
表示一组任务,且该组任务之间有一定的联系,由 TaskDispatcher 执行createDispatchGroup 创建并返回,代码如下所示。
/** * 任务组 */
private void taskGroup(Context context) {
//创建并发任务分发器
TaskDispatcher dispatcher = context.createParallelTaskDispatcher(“parallelTaskDispatcher”, TaskPriority.DEFAULT);
//创建任务组
Group group = dispatcher.createDispatchGroup();
// 将任务 1 加入任务组,
dispatcher.asyncGroupDispatch(group,new Runnable() {
@Override public void run() {
HiLog.info(label,“download task1 is running”);
}
}
); // 将任务 2 加入任务组, dispatcher.asyncGroupDispatch(group, new Runnable() {
@Override public void run() {
HiLog.info(label,“download task2 is running”); } }); // 在任务组中的所有任务执行完成后执行指定任务。
dispatcher.groupDispatchNotify(group, new Runnable() {
@Override public void run() {
HiLog.info(label, “the close task is running after all tasks in the group are completed”);
}
});
}
onStart方法中调用
![](https://img-blog.csdnimg.cn/img_convert/1518181a0ba82c8e8d9ace37e711e2a0.webp?x-oss-process=image/format,png)
运行效果如下,我运行了两次,两次日志是不一样的,如果里面执行的业务是不一样的,则耗时长的后完成。
![](https://img-blog.csdnimg.cn/img_convert/9eedd71651fa3091dddab8d7f62d21be.webp?x-oss-process=image/format,png)
#### ⑨ 取消任务(Revocable)
Revocable 是取消一个异步任务的接口。异步任务包括通过 asyncDispatch、delayDispatch、asyncGroupDispatch 派发的任务。如果任务已经在执行中或执行完成,则会返回取消失败。
/** * 取消异步任务 */
private void revocableAsyncTask(Context context) {
TaskDispatcher dispatcher = context.getUITaskDispatcher();
Revocable revocable = dispatcher.delayDispatch(new Runnable() {
@Override
public void run() {
HiLog.info(label, "delay dispatch");
}
},
10);
boolean revoked = revocable.revoke(); HiLog.info(label, “” + revoked);
}
在onStart()中调用
//取消异步任务revocableAsyncTask(MainAbility.this);
运行效果如下:
![](https://img-blog.csdnimg.cn/img_convert/7e512dd11369bab890574cf451445665.webp?x-oss-process=image/format,png)
#### ⑩ 同步设置屏障任务 (syncDispatchBarrier)
在任务组上设立任务执行屏障,同步等待任务组中的所有任务执行完成,再执行指定任务。在全局并发任务分发器(GlobalTaskDispatcher)上同步设置任务屏障,将不会起到屏障作用。就比如说考试提前交卷,A提前20分钟,B提前10分钟,但你只是离开了考室,离不开考场,这个考场的门就是这个屏障,无论你是提前多久,你都要等到所有考生考完,老师收卷之后才能离开考场,就是这么一个理。代码如下:
/** * 同步设置屏障任务 */
private void setSyncDispatchBarrier(Context context) {
TaskDispatcher dispatcher = context.createParallelTaskDispatcher(“parallelTask”,TaskPriority.DEFAULT);
//创建任务组
Group group = dispatcher.createDispatchGroup(); //将任务1加入任务组
dispatcher.asyncGroupDispatch(group, new Runnable() {
@Override public void run() {
<