Android断网优化 —— 使用数据缓存

204 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

你是否遇到过app在手机没有网络的时候,显示白板的页面,好一点的提示了没有数据,但这都不是最好的做法。在有必要的时候,展示历史数据才是最佳的做法。

没网的时候加载数据,从哪里加载?这是一个好问题。有人说,SharedPreferences,可以。有人说,MMKV,也没有问题。这些不能用于复杂的业务场景,也不方便进行结构化数据的保存和数据筛选。

最专业的数据缓存当然是使用SQLite数据库了。在手机没有网络的时候,调用接口肯定是没有数据返回的,那么我们就要做一个缓存对该接口的数据进行映射。一个界面上的某块区域的显示,相关数据的接口,以及该数据的缓存,是一一对应关系。

当手机有网络的时候,请求接口,同时将该接口的数据缓存到SQLite。在下次断网的时候,查询该接口对应的数据库缓存,并加载离线数据。所有请求接口的按钮,在请求接口之前,我们应该检测一下网络是否可用,再去执行后面的流程。这样做的原因是,没网的时候,有层级关联的多个页面,应该让其看到所有界面,只不过加载缓存的数据。只不过要调接口的时候,就被拦截了,然后提示网络不可用。不让用户进去看所有页面不是一个好的做法。我们要做的就是,随便用户怎么玩,该给他看的界面都要给他看,只不过不可以用罢了。

关于数据库缓存的具体逻辑,不建议做更新model的操作,只做删除和添加的操作,要么就清除缓存的数据,要么就进行缓存,这样可以有效避免缓存的错误。

数据库缓存应该考虑到多用户的情况,不同用户缓存的数据是不一样的,一般使用userId来区分。所有没有的数据都要进行缓存,只不过读取的时候,根据userId过滤罢了。

说了这么多,有框架吗?答案是有的,我有一个简单的思路,供大家参考。开源代码在这里github.com/dora4/dcach… 。示例在这里github.com/dora4/DoraC… 。目前已经支持的数据库ORM框架有内置的dora-db、room和greendao。具体看我的专栏【Android数据缓存】,这里有很详细的设计思路。