背景
日常开发的过程中,对于某个状态变更的监听,一般都是使用注册listener
的方式,在状态变更的时候,遍历注册的listener
一一进行通知,这种情况,经常会出现一些任务扎堆执行的情况,譬如登录完成(或者其他类似的通知监听),如果一个APP里面有很多的业务,每个模块都注册了监听,在登录状态变更的时候,会去获取更新数据或者干一些业务相关的逻辑。这种情况下这种实现方式会存在以下几个问题:
1、通知无优先级概念,A场景触发的登录,并不能优先处理A场景的状态变更;
2、导致瞬间UI线程繁忙,极端情况下会导致丢帧、卡顿;
3、通知之后的业务执行不可控,出现问题的时候,很难定位是什么原因导致的。
因此想写一个框架来解决这种问题。
职责
1、负责所有注册任务的调度,
2、利用线程池技术,增加吞吐量,让任务都能够尽快执行;
3、有优先级概念,A触发的场景,优先处理A场景的任务;
4、解决扎堆执行可能导致的丢帧、卡顿问题。
怎样做?
1、任务存在优先级:priority
2、支持不同的调度策略
3、支持动态更改优先级;
如果任务是一次性的,那在一开始添加任务的时候,我们根据不同的业务重要优先级确定任务的优先级即可(譬如启动完成)。但还有另外一种类型的任务,是在运行过程中会多次执行的,由于任务是一开始就添加的,需要在其他的场景再次进行
sort
,怎样做才能够让任务动态的优先级动态变更呢?
一开始注册的时候,按照时间戳作为优先级的大小;然后在A场景开始触发任务调度的时候,更新A场景对应的任务的priority
为当前时间。这样子A场景对应的任务就可以在新一轮调度中,最高优执行。