HarmonyOS Sample 之 TaskDispatcher线程管理 原创 精华
目录
HarmonyOS Sample 之 TaskDispatcher线程管理
1.介绍
不同应用在各自独立的进程中运行。当应用以任何形式启动时,系统为其创建进程,该进程将持续运行。当进程完成当前任务处于等待状态,且系统资源不足时,系统自动回收。
在启动应用时,系统会为该应用创建一个称为“主线程”的执行线程。该线程随着应用创建或消失,是应用的核心线程。UI界面的显示和更新等操作,都是在主线程上进行。主线程又称UI线程,默认情况下,所有的操作都是在主线程上执行。如果需要执行比较耗时的任务(如下载文件、查询数据库),可创建其他线程来处理。
如果应用的业务逻辑比较复杂,可能需要创建多个线程来执行多个任务。这种情况下,代码复杂难以维护,任务与线程的交互也会更加繁杂。
要解决此问题,开发者可以使用“TaskDispatcher”来分发不同的任务。
比如前段时间 “疫情助手” 的卡片应用,需要获取位置信息并进行逆地理编码,安康码的生成,这些功能就需要单独创建多个线程来执行任务。
2.搭建环境
安装DevEco Studio,详情请参考DevEco Studio下载。
设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
下载源码后,使用DevEco Studio 打开项目。
3.理论支持
TaskDispatcher是一个任务分发器,它是Ability分发任务的基本接口,隐藏任务所在线程的实现细节。
TaskDispatcher具有多种实现,每种实现对应不同的任务分发器。在分发任务时可以指定任务的优先级,由同一个任务分发器分发出的任务具有相同的优先级。
系统提供的任务分发器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。
线程优先级有HIGH、DEFAULT、LOW,执行几率递减。
分发器提供了常用的操作,
包括:同步派发任务、异步派发任务、异步延迟派发任务、同步设置屏障任务、异步设置屏障任务、执行多次任务、取消任务、任务组等操作。
后面的实例分析中我们会逐个讲解几种任务分发器的概念和用法。
4.实例讲解
4.1.UI界面
UI界面很简单了, 就是为了试验不同类型的任务分发器而设计的按钮,如下图:
4.2.后台代码
重点在这了,官方代码结合API提示,增加了注释说明
4.2.1 GlobalTaskDispatcher 全局并发任务分发器
全局并发任务分发器,由Ability执行getGlobalTaskDispatcher()获取。
适用于任务之间没有联系的情况。一个应用只有一个GlobalTaskDispatcher,它在程序结束时才被销毁。我们从名字也能看出是get而不是createXXX,具有全局唯一性。
a.同步派发任务
输出结果
b.异步派发任务
输出结果
c.异步延迟派发任务
输出结果
d.执行多次任务
执行多次任务:对指定任务执行多次。多次执行的顺序也不是固定的。
输出结果
4.2.2 ParallelTaskDispatcher 并发任务分发器
并发任务分发器,由Ability执行createParallelTaskDispatcher()创建并返回。
与GlobalTaskDispatcher不同的是,ParallelTaskDispatcher不具有全局唯一性,可以创建多个。开发者在创建或销毁dispatcher时,需要持有对应的对象引用。
a.同步设置屏障任务
同步设置屏障任务:在任务组上设立任务执行屏障,同步等待任务组中的所有任务执行完成,再执行指定任务。
在全局并发任务分发器(GlobalTaskDispatcher)上同步设置任务屏障,将不会起到屏障作用。
输出结果
b.异步设置屏障任务
异步设置屏障任务:在任务组上设立任务执行屏障后直接返回,指定任务将在任务组中的所有任务执行完成后再执行。
在全局并发任务分发器(GlobalTaskDispatcher)上异步设置任务屏障,将不会起到屏障作用。
可以使用并发任务分发器(ParallelTaskDispatcher)分离不同的任务组,达到微观并行、宏观串行的行为。
输出结果
c.任务组
任务组:表示一组任务,且该组任务之间有一定的联系,由TaskDispatcher执行createDispatchGroup创建并返回。
将任务加入任务组,返回一个用于取消任务的接口。
输出结果
从日志输出看,说明groupDispatchNotify也是一个异步任务。
4.2.3 SerialTaskDispatcher 串行任务分发器
串行任务分发器,由Ability执行createSerialTaskDispatcher()创建并返回。由该分发器分发的所有的任务都是按顺序执行,但是执行这些任务的线程并不是固定的。
如果要执行并行任务,应使用ParallelTaskDispatcher或者GlobalTaskDispatcher,而不是创建多个SerialTaskDispatcher。
如果任务之间没有依赖,应使用GlobalTaskDispatcher来实现。它的创建和销毁由开发者自己管理,开发者在使用期间需要持有该对象引用。
输出结果
同步派发任务
从输出看出所有的任务都是按顺序执行的。
4.2.4 SpecTaskDispatcher 专有任务分发器
专有任务分发器,绑定到专有线程上的任务分发器。目前已有的专有线程为UI线程,通过UITaskDispatcher进行任务分发。
UITaskDispatcher:绑定到应用主线程的专有任务分发器, 由Ability执行getUITaskDispatcher()创建并返回。 由该分发器分发的所有的任务都是在主线程上按顺序执行,它在应用程序结束时被销毁。
a.取消任务
取消任务:Revocable是取消一个异步任务的接口。
异步任务包括通过 asyncDispatch、delayDispatch、asyncGroupDispatch 派发的任务。如果任务已经在执行中或执行完成,则会返回取消失败。
输出结果
取消成功,所以Delay task run finished 日志并没有打印。
5.完整代码
附件直接下载
楼主深夜码字辛苦了
哈哈,那时候还很精神,感谢支持。
牛啊,2点太肝了