之前做项目遇到一个需求场景,APP常常运行在弱网甚至无网的环境中,导致和后端的交互无法实时同步数据。大部分的思路都是把数据先缓存在本地,开发一些针对无网状态的页面,用户在页面进行操作更新数据,最后在有网条件下在特定页面将最终状态的数据和后端进行同步。
开发一套成熟的通用框架,预先定义好要处理的过程,在无网条件下向任务队列提交任务,等到条件满足(有网)自动执行相应的任务,并记录任务执行结果。最好与业务无关,并且将条件进一步抽象,并不局限于网络,提供开发者自定义条件的能力。
由此,木牛流马应景而生
晋·陈寿《三国志·诸葛亮传》记载:“建兴九年,亮复出祁山,以木牛运,粮尽退军;十二年春,亮悉大众由斜谷出,以流马运,据武功五丈原,与司马宣王对于渭南。”
就仿佛木牛流马,预先设置好机关,等待时机成熟,便照吾意自行行事。
传统离线方案 | 木牛流马 | |
---|---|---|
用户体验 | 感知明显 | 无感 |
业务关联 | 业务相关 | 业务无关 |
工作量 | 每个业务都要前后端配合开发 | 前端工作量大大降低,后端几乎不需要开发 |
同步时机 | 只在相应页面触发同步流程 | APP全局(可开发者控制) |
任务结果 | 无记录 | 自动记录,并提供API追溯 |
触发条件 | 监听网络变化 | 不限于网络,用户自定义任意触发条件 |
假设任务是一次网络接口请求,原本调用OkHttp的API,现调用WoodenOx的提交任务API,框架自动维护任务队列,在所有任务定义的条件满足时,通过类加载的形式调用开发者定义的执行流程。任务队列保证了接口的调用顺序,就好像用户在有网下以非常快的速度做出一系列操作,木牛流马只是帮助模拟了用户的这一过程。
可以简单理解木牛流马把离线状态下的操作推迟到在线状态并迅速有序执行。
好处是后端开发者几乎没有什么工作任务,还是像以往有网情况开发业务接口(除非对木牛流马操作做特殊处理),但是APP已经拥有了离线的能力。
不可否认,该项目借鉴了WorkManager的思想,但侧重点不同。
WorkManager 适用于需要可靠运行(ps:并不可靠)的工作,即使用户导航离开屏幕、退出应用或重启设备也不影响工作的执行。
例如:
- 向后端服务发送日志或分析数据。
- 定期将应用数据与服务器同步。
WoodenOx适用于当前条件并不满足,需要延迟执行的工作。
例如:
- 在无网时仍能进行正常在有网下才能进行的交互操作。
- 封装成JSAPI提供给小程序(H5),赋予前端离线能力。
WorkManager | WoodenOx | |
---|---|---|
分布提交任务 | × | √ |
自定义条件 | × | √ |
工作链 | √ | √ |
立即执行 | √ | √ |
长时间执行 | √ | √ |
延期执行 | √ | √ |
执行优先级 | × | √ |
加急任务 | √ | × |
定期执行 | √ | 非原生支持 |
数据在任务链传递 | × | 开发中 |