Android 轮询执行策略项目设计
引用
策略,顾名思义是指在执行某些行为时的方式。当然不同的时间、不同的位置、不同的环境可能都会应用不同的策略,说明策略具有可变性。即在要求最优化的实现目标时,不断应用不同策略而达到理想的目标
【转发请注明来源,谢谢!】
项目场景:
在项目模块中主要存在一些定时任务的策略,00:00 到 24:00针对不同的设备配置最多能存在24条策略包。在线策略包应用优先级会高于离线策略包,当时如果设备是离线状态的话,就应用于离线策略包。
设计
在前面的项目场景,可以概况需要做的三件事情
1、处理分包职责(针对设备配置、是否有效、是否应用于当前这个设备),即分包处理管理
2、离线策略包与在线策略包调配
3、策略包的应用,即管理策略定时任务
先说下下面几个Manager的意义
- StrategyManager 策略的集中管理控制类,负责协调策略应用的所有Manager(下面所有)
- StrategyPackageManager 根据规定的协议,负责拆包、组包有效策略包
- OnlineManager 与 OfflineManager ,分别管理在线策略包和策略包。OnlineManager主要是在request获取时候获取的策略、OfflineManager则是从数据库获取时候获取的策略。
- PoolManager 管理有效的策略池
- AlarmManagerService 负责一些定时任务操作
(一) StrategyPackageManager 分包处理管理
处理分包主要应用了代理模式,真正控制策略的管理者StrategyManager不会去处理分包的管理工作。这样设计有个优势,StrategyManager只需要关心如何去处理有效策略池的应用,如何处理分包对他是透明无知的。如果以后策略包规则修改了,由StrategyPackageManager去做适应即可。
(二) OnlineManager 与 OfflineManager 离线策略包与在线策略包调配
首先,曾经从服务器获取到的策略包会缓存在本地数据库中,并且由OfflineManager进行管理,这里统一称离线策略。实时从服务器获取(推送或http),由OnlineManager进行管理,这里统一称在线策略。在模块启动时刻,由于避免网络差异性问题会优先使用离线策略,当然如果成功从服务器中获取到新的策略会重新应用最新的策略,并将新的策略缓存于OfflineManager中等到下次应用。
通过(一)、(二)我们就可以将策略包应用在StrategyManager中的PoolManager中了。PoolManager主要是StrategyManager与AlarmManagerService(闹钟服务,后面会讲到)交互的桥梁。PoolManager主要维护了一个策略池。通过(一)、(二)的操作后获得的有效策略包都会统一存储到这里,例如图所示
image.png简单说明下上图:无论是 OnlineManager,还是OfflineManager 经过处理分包的StrategyPackageManager得到的有效策略包都会add进去poolManager的策略池。
(三) 管理策略定时任务
前面提到的AlarmManagerService,这是一个理由Android中的alarmmanager来提供策略的闹钟服务。每次poolManager都会push一个有效的策略,让alarmmanager来启动一个定时任务。当定时任务到点执行了对应的action之后,通过广播让poolManager pop掉这个应用完的策略,再重新push一个有效的策略让alarmmanager进行下一个定时任务,以此类推。
当然,这里在pop之后,有个校验机制checkAction。如果当前策略池已经pop完了,就再不会push策略给alarmmanager了。poolManager会通过回调通知告诉StrategyManager:"我策略用完了,请再喂我策略吧!"。此时如果没有推送触发、或者网络请求,就会告诉OfflineManager重新应用之前的那套策略包,这样一直工作下去。如图所示:
image.png总结:
这边文章并没有长篇大论描述下设计原理,只是大概讲了整个设计的思维模型。当时设计与实现距离现在也半年多了,突然想起总结总结。希望对阅读的朋友有些思维触发什么的吧~能力有限,正在努力哈!
My Email : sy.wu@foxmail.com
Siven Wu
2018.4.14