创建一个名为“ParallelTaskDispatcher”的Car设备类型的任务,用于演示ParallelTaskDispatcher任务分发器派发任务的使用。
修改ability_main.xml
修改ability_main.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<Text
ohos:id="$+id:text_start_parallel_task_dispatcher"
ohos:height="match_parent"
ohos:width="match_content"
ohos:background_element="$graphic:background_ability_main"
ohos:layout_alignment="horizontal_center"
ohos:text="Start ParallelTaskDispatcher"
ohos:text_size="50"
/>
</DirectionalLayout>
显示界面效果如下图1所示
自定义任务
MyTask是自定义的一个任务。该任务逻辑比较简单,只是模拟了一个耗时的操作。
package com.waylau.hmos.paralleltaskdispatcher;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.concurrent.TimeUnit;
public class MyTask implements Runnable {
private static final String TAG = MyTask.class.getSimpleName();
private static final HiLogLabel LABEL_LOG =
new HiLogLabel(HiLog.LOG_APP, 0x00001, TAG);
private String taskName;
public MyTask(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
HiLog.info(LABEL_LOG, "before %{public}s run", taskName);
int task1Result = getRandomInt();
try {
// 模拟一个耗时的操作
TimeUnit.MILLISECONDS.sleep(task1Result);
} catch (InterruptedException e) {
e.printStackTrace();
}
HiLog.info(LABEL_LOG, "after %{public}s run, result is: %{public}s", taskName, task1Result);
}
// 返回随机整数
private int getRandomInt() {
// 获取[0, 1000)之间的int整数。方法如下:
double a = Math.random();
int result = (int) (a * 1000);
return result;
}
}
这个耗时操作,是通过获取一个随机数,而后根据随机数执行线程sleep实现的。
执行任务派发
修改MainAbilitySlice,增加任务派发器相关的逻辑。
package com.waylau.hmos.paralleltaskdispatcher.slice;
import com.waylau.hmos.paralleltaskdispatcher.MyTask;
import com.waylau.hmos.paralleltaskdispatcher.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
import ohos.app.dispatcher.Group;
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import java.util.Random;
import java.util.concurrent.TimeUnit;
public class MainAbilitySlice extends AbilitySlice {
private static final String TAG = MainAbilitySlice.class.getSimpleName();
private static final HiLogLabel LABEL_LOG =
new HiLogLabel(HiLog.LOG_APP, 0x00001, TAG);
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
// 添加点击事件来触发
Text textStartDispatcher =
(Text) findComponentById(ResourceTable.Id_text_start_parallel_task_dispatcher);
textStartDispatcher.setClickedListener(listener -> startDispatcher());
}
// 指定任务排发
private void startDispatcher() {
String dispatcherName = "MyDispatcher";
TaskDispatcher dispatcher = this.getContext().createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
// 创建任务组
Group group = dispatcher.createDispatchGroup();
// 将任务1加入任务组
dispatcher.asyncGroupDispatch(group, new MyTask("task1"));
// 将与任务1相关联的任务2加入任务组
dispatcher.asyncGroupDispatch(group, new MyTask("task2"));
// task3必须要等任务组中的所有任务执行完成后才会执行
dispatcher.groupDispatchNotify(group, new MyTask("task3"));
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
上述代码,
l Text增加了点击事件,以触发startDispatcher任务
l startDispatcher方法中创建了ParallelTaskDispatcher任务派发器
l 创建了三个MyTask任务实例,这些任务都是一个任务组。
l task1和task2通过asyncGroupDispatch方式异步派发。
l task3通过groupDispatchNotify方式派发。groupDispatchNotify方式是需要等任务组中的所有任务执行完成后才会执行指定任务。
运行
运行应用后,点击2次界面文本“Start ParallelTaskDispatcher”以触发任务派发。此时,控制台输出如下:
01-15 11:29:18.180 15991-16685/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task1 run
01-15 11:29:18.181 15991-16686/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task2 run
01-15 11:29:18.338 15991-16686/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task2 run, result is: 157
01-15 11:29:18.974 15991-16685/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task1 run, result is: 793
01-15 11:29:18.976 15991-16744/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task3 run
01-15 11:29:19.248 15991-16744/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task3 run, result is: 269
01-15 11:29:22.499 15991-16946/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task1 run
01-15 11:29:22.500 15991-16947/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task2 run
01-15 11:29:22.666 15991-16947/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task2 run, result is: 166
01-15 11:29:23.203 15991-16946/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task1 run, result is: 704
01-15 11:29:23.204 15991-16995/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: before task3 run
01-15 11:29:23.750 15991-16995/com.waylau.hmos.paralleltaskdispatcher I 00001/MyTask: after task3 run, result is: 545
分别执行了两次,可以看到 task1和 taks2先后顺序是随机的,但task3一定是在task1和 taks2完成之后,才会执行。
源码
更多示例源码,见《跟老卫学HarmonyOS》 https://github.com/waylau/harmonyos-tutorial