网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
如果刚才的内容你都知道的话,那么下面的内容你就不一定也知道,如果你知道,就当我没说。下面我们从实际的场景来着手说明,例如自动更新:应用在进入首页时需要通过访问后台得到最新的应用版本,同时将版本信息保存到本地,当版本不一致时可以选择下载安装更新,但是更新又是在后台进行的,因为你不能够让用户等你更新完再使用。这样一个流程要在Android里面实现也不是什么难事,同一时间执行多个任务且不在主线程执行,也许我这个比方打的不是很好,你应该能懂我的意思。因为这个业务还比较的简单,举这个例子就是为了说明TaskDispatcher (音译:他死 diss 怕球儿~),注意这个儿化音,划重点,要考的。后面三个字说的要快,并且带点伦敦郊区的口音,只要你的英语说的够快,别人就不知道你说的是中文。天下武功,唯快不破。
TaskDispatcher 是一个任务分发器,它是 Ability 分发任务的基本接口,隐藏任务所在线程的实现细节。为保证应用有更好的响应性,我们需要设计任务的优先级。在 UI 线程上运行的任务默认以高优先级运行,如果某个任务无需等待结果,则可以用低优先级。级别如下
-
HIGH 最高任务优先级,比默认优先级、低优先级的任务有更高的几率得到执行。
-
DEFAULT 默认任务优先级, 比低优先级的任务有更高的几率得到执行。
-
LOW 低任务优先级,比高优先级、默认优先级的任务有更低的几率得到执行。
TaskDispatcher 具有多种实现,每种实现对应不同的任务分发器。在分发任务时可以指定任务的优先级,由同一个任务分发器分发出的任务具有相同的优先级。系统提供的任务分发器有 GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。为了方便演示代码我新建一个手表的鸿蒙项目,如下图所示:
① 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