格物、致知、诚意、正心

0%

DataCache 库 (年轻人的第一个开源库)

简介

这个库会针对某一个特定的数据在内存中只保存一个对象,有数据更新的时候只会更新其中的字段,对象的引用并不会发生变化。

搭配数据绑定框架之后,可以保证所有页面的数据和状态同步。

为什么写这个库

数据同步其实一直是一个比较棘手的问题:当你在一个子页面点赞或者评论之后返回,父页面并没有发生变化,就比较尴尬了。如果嵌套更深的话,直接路由到首页也会出现这个问题。

这个在网页到还不是什么大问题,因为是不同的页面。但是在客户端的话,用户只会看到你这出问题了。

当然,解决方案也是有很多:

  • 数据库同步
  • 发消息同步
  • 让用户自己刷新

因为数据绑定我用的非常的多,而且同事们大家都觉得数据绑定框架不错,所以准备找一个依据此框的解决方案。而且我们一致认为不应该引入重量级的数据库来做这个事情,就只能在内存中做了。而且又因为状态改变之后需要同步到View,而数据绑定到布局的对象并不方便随便更改,所有就想到了在内存中维护一个唯一对象的方式。

最早虽然是唯一对象,但是并没有使用注解处理器生成代码,而是手动根据需要更新的字段进行配置。然后手动在API层做一些标记,但是这样比较麻烦,而且数据结构改变之后并不能及时同步,容易出现问题。

然后我就使用了注解处理器,根据API返回的字段进行标记。对内存中的原始对象只更新有用的字段,而且由于字段自动化了,工作量大大降低了。

注解处理器其实和代码并没有什么不同,不过就是在解决某些问题上效率有区别,在合适的场景选择合适的工具。

当然,要根据API返回数据进行标记的话,需要在JSON层面进行处理,所以就只能魔改Gson了。然后这两个库搭配起来,就做到了新流入的数据都是有标记的,对象中的哪些字段是有用的,都可以区分。

之后在数据层的接口处进行过滤,将新的解析出来的对象替换为原始对象,然后将需要更新的字段进行更新。这样,之前绑定的UI就会自动更新了。所有页面的数据永远都是最新的,永远都是相同的展示。

优缺点

有什么优点

  • 减少相同数据对象冗余
  • 全局展示数据和状态同步
  • 内存原始对象字段完整度高 (API如果在某些情况只返回几个字段,那么解析出来的对象中的其他字段都是没有用的)
  • 逻辑层更改状态并不需要接触UI,也不会间接接触UI(监听器模式,当然只在我们自己写的代码中,数据绑定生成的观察者也是有引用的)

有什么缺点

  • 不能保证100%靠谱(靠谱程序和后台API接口的优雅程度正相关)
  • 不同API返回数据有差异 (后台缓存或者同步问题,会导致不同接口返回数据不一致,会导致数据变化)
  • API返回字段无效或者错误 (会导致整个应用内部数据都出错,当然有些API是客户端控制返回字段的,然而这并没有什么*用)
  • 不靠谱 ~

总结

只建议没有能力或者没有资源做到完美的团队使用。

对于对数据流控制完美,逻辑架构优秀,开发资源充沛,排期并不紧张,测试严禁充分的优秀团队来说:这并不算是一个比较好的解决方案。

更新计划

应该就到此为止了,整体设计思路已经完成,没有必要再增加新的功能,估计后续只是优化细节。

如果有一些优化或者扩展的想法,请联系我。

最后

这算是我第一个正式的开源库了,很有纪念意义。

当然肯定不会是最后一个。我要渐渐成长,然后为开源做出更大的贡献~