2024年鸿蒙 线程讲解(任务分发、线程通信)(4),2024年最新面试

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


如果刚才的内容你都知道的话,那么下面的内容你就不一定也知道,如果你知道,就当我没说。下面我们从实际的场景来着手说明,例如自动更新:应用在进入首页时需要通过访问后台得到最新的应用版本,同时将版本信息保存到本地,当版本不一致时可以选择下载安装更新,但是更新又是在后台进行的,因为你不能够让用户等你更新完再使用。这样一个流程要在Android里面实现也不是什么难事,同一时间执行多个任务且不在主线程执行,也许我这个比方打的不是很好,你应该能懂我的意思。因为这个业务还比较的简单,举这个例子就是为了说明TaskDispatcher (音译:他死 diss 怕球儿~),注意这个儿化音,划重点,要考的。后面三个字说的要快,并且带点伦敦郊区的口音,只要你的英语说的够快,别人就不知道你说的是中文。天下武功,唯快不破。

TaskDispatcher 是一个任务分发器,它是 Ability 分发任务的基本接口,隐藏任务所在线程的实现细节。为保证应用有更好的响应性,我们需要设计任务的优先级。在 UI 线程上运行的任务默认以高优先级运行,如果某个任务无需等待结果,则可以用低优先级。级别如下

  • HIGH 最高任务优先级,比默认优先级、低优先级的任务有更高的几率得到执行。

  • DEFAULT 默认任务优先级, 比低优先级的任务有更高的几率得到执行。

  • LOW 低任务优先级,比高优先级、默认优先级的任务有更低的几率得到执行。

TaskDispatcher 具有多种实现,每种实现对应不同的任务分发器。在分发任务时可以指定任务的优先级,由同一个任务分发器分发出的任务具有相同的优先级。系统提供的任务分发器有 GlobalTaskDispatcherParallelTaskDispatcherSerialTaskDispatcherSpecTaskDispatcher。为了方便演示代码我新建一个手表的鸿蒙项目,如下图所示:

在这里插入图片描述

① GlobalTaskDispatcher

全局并发任务分发器,(音译:狗萝卜 他死 diss 怕球儿~,解说:前面三个字要读的比后面三个字更快才行,有难度的)由 Ability 执行 getGlobalTaskDispatcher()获取。适用于任务之间没有联系的情况。一个应用只有一个 GlobalTaskDispatcher,它在程序结束时才被销毁。

/**

  • priority 优先级

**/

public TaskDispatcher getGlobalTaskDispatcher(TaskPriority priority) {

throw new RuntimeException(“Stub!”);

}

我在MainAbility中通过调用getGlobalTaskDispatcher()方法,传入一个等级TaskPriority.DEFAULT,这个也可以用null来代替。然后得到一个TaskDispatcher的对象

在这里插入图片描述

② ParallelTaskDispatcher

并发任务分发器,(音译:佩尔楼 他死 diss 怕球儿~)由 Ability 执行 createParallelTaskDispatcher()创建并返回。与GlobalTaskDispatcher 不同的是,ParallelTaskDispatcher 不具有全局唯一性,可以创建多个。开发者在创建或销毁 dispatcher 时,需要持有对应的对象引用 。

/**

  • 创建并发任务分发器

  • @param name 名称

  • @param priority 优先级

  • @return parallelTaskDispatcher

*/

public TaskDispatcher createParallelTaskDispatcher(String name, TaskPriority priority) {

throw new RuntimeException(“Stub!”);

}

创建时传两个参数,一个字符串的名字,一个是等级优先级,这里我用null也可以的。这里你又可以想一下为什么需要多一个名字参数,当然是为了区别不同的并发任务分布器,不过至于可不可以重名我就不知道了,理论上来说,应该不允许重名,说不定会给你报错,可以自己去尝试。

在这里插入图片描述

③ SerialTaskDispatcher

串行任务分发器(音译:C瑞尔 他死 diss 怕球儿~)由 Ability 执行 createSerialTaskDispatcher()创建并返回。由该分发器分发的所有的任务都是按顺序执行,但是执行这些任务的线程并不是固定的。如果要执行并行任务,应使用 ParallelTaskDispatcher 或者 GlobalTaskDispatcher,而不是创建多个SerialTaskDispatcher。如果任务之间没有依赖,应使用 GlobalTaskDispatcher 来实现。它的创建和销毁由开发者自己管理,开发者在使用期间需要持有该对象引用。你可以把它理解成一个有序列表,但是列表里面的值是可变的。它的方法如下:

/**

  • 创建串行任务分发器

  • @param name 名字

  • @param priority 优先级

  • @return SerialTaskDispatcher

*/

public TaskDispatcher createSerialTaskDispatcher(String name, TaskPriority priority) {

throw new RuntimeException(“Stub!”);

}

获取方法

在这里插入图片描述

④ SpecTaskDispatcher

专有任务分发器(音译:思拜客 他死 diss 怕球儿~) 专有任务分发器,绑定到专有线程上的任务分发器。目前已有的专有线程是主线程。

UITaskDispatcher 和 MainTaskDispatcher 都属于 SpecTaskDispatcher。建议使用UITaskDispatcher。

UITaskDispatcher:绑定到应用主线程的专有任务分发器, 由 Ability 执行getUITaskDispatcher()创建并返回。 由该分发器分发的所有的任务都是在主线程上按顺序执行,它在应用程序结束时被销毁。之前我们说主线程上不能执行过多的任务,那么这个分发器就可以绑定到主线程上,进而可以执行很多任务,你可以这么理解。方法如下:

/**

  • 获取主线程任务分发器

  • @return MainTaskDispatcher

*/

public final TaskDispatcher getMainTaskDispatcher() {

throw new RuntimeEx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值