Android APP开发实战:从规划到上线全程详解
上QQ阅读APP看书,第一时间看更新

3.5 数据同步方案

3.5.1 文件的同步

通常图片都需要在APP端做缓存处理,所以从服务器返回图片链接的时候,一定要同时返回图片最新修改的时间戳。APP将本地存储图片的时间戳和从服务器获取的时间戳进行对比,判断是否需要更新本地缓存的图片。

服务器返回一个“modification_time”字段,用于表示图片的修改时间,如下所示。

        {
            "image":{
                "modifi cation_time":1525065977
                "image_url":"http://www.test.com/image/test.jpg"
            }
        }

对于其余类型的数据文件,可以用时间戳,也可以用版本号作为是否更新的依据,而且最好把版本号或时间戳保存在数据文件里。

在保存地址数据的JSON格式文件里,使用version字段表示版本号,如图3-4所示。

图3-4

当前文件的版本号为1.0。

用户在使用APP时,如果遇到和这个数据文件相关的问题,打开文件后,根据版本号就很容易知道与最新的数据文件有什么不同,便于解决问题。

对于一些二进制文件,不方便在文件数据里增加版本号或时间戳,就只能像图片文件一样,服务器返回给APP特定的字段表示版本号或修改时间。APP端除了保存文件外,还需要保存这个字段的数值。

3.5.2 地址数据的同步

由于中国行政区域地址数据比较大,做成JSON格式文件有400多K,压缩后也有30多K,用户使用APP编辑地址数据时,如每次都从服务器下载这些数据,比较耗费数据流量、数据下载时间和解析时间,会导致客户体验不好,有以下4种解决方案。

(1)在服务器和APP中都内置一个包含地址数据的文件,在地址编辑界面会先获取服务器端的地址数据文件版本号或时间戳,并和本地数据文件的版本号或时间戳进行比较,如果一致就启用本地的文件,如果不一致就从服务器下载新的文件并覆盖本地的文件。

毕竟地址数据不会经常变更,这样就大大减少了从服务器获取数据的次数,从而改善用户体验。

为了进一步减少传输的数据量,还可以采用增量更新机制。服务器每次只把有变动的地址数据发给APP,并在每个有变动的地址数据中增加一个字段,用于区别数据变动属于增、删和改中的哪种情况。APP根据数据变动的类型,处理存放在本地的数据。

(2)如果APP支持定位功能或在首页让用户选择当前所在的地区,如自动定位到上海,或用户选择了上海,则在地址编辑界面从服务器只获取上海市的二、三级地址数据,这样从服务器获取的数据量就很小了,而且可以始终获取到最新数据。

(3)可以根据用户当前设备的IP地址判断用户所在的地区。在地址编辑界面,从服务器只获取用户所在地区的二、三级地址数据,那么从服务器获取的数据量就很小了,还可以始终获取到最新数据。

(4)因为直辖市、省和自治区这些一级地址区域的名称基本不会改变,所以可以把这些数据内置在APP中。在地址编辑界面,首先让用户选择一级地址区域,然后再从服务器获取所选区域的二、三级地址数据,那么从服务器获取的数据量就很小了,还可以始终获取到最新数据。

3.5.3 非地址数据的同步

(1)用数据变更的时间戳判断是否更新APP本地的数据。

例如,电商APP与电商网站之间的购物车和收藏夹等数据的同步(用户可能会随时改变数据),就可以采用时间戳作为判断依据,具体方案如下所述。

· 用户通过APP或浏览器修改购物车数据时,都要保存修改的时间点,且把时间点上传到服务器。

· 用户通过APP或浏览器发起更新购物车数据的请求时,把本地保存的上次修改的时间点发给服务器,服务器把这个时间点和之前保存的时间点进行比较。如果服务器端的时间点比较新,就把服务器的购物车数据返回给APP或浏览器;否则不返回购物车数据。

(2)用数据失效的时间戳判断是否更新APP本地的数据,就是用数据变更的时间戳加上数据有效期来进行判断。

电商APP从服务器获取的商品数据有一定的时效性,为了减少和服务器的交互,就可以采用此方式判断是否需要从服务器更新数据。

例如,服务器向APP返回商品详情数据时,除了商品属性外,还要加上数据失效的时间戳,如下所示:

        {
            "product":{
                  "expiry_time":1625065977
                  "name":"铅笔"
                  "price":1.00
                  "image_url":"http://www.test.com/image/test.jpg"
            }
        }

APP每次进入商品详情界面时,通过比较当前时间和本地存储的数据失效时间戳,来判断是从服务器获取数据,还是用本地缓存的数据。

以上两种方式都需要保证APP和服务器的时间同步。

(3)用PUSH机制推送实现。

电商APP的首页通常有视频或图片广告,这些广告的数据量都比较大,如每次进入首页都要从服务器获取,比较浪费流量。每次服务器端变更了数据,APP端又需要及时更新,这时就可以用PUSH机制推送,即服务器端变更数据时发送PUSH消息给APP, APP就从服务器获取数据。若APP没有收到PUSH消息,则使用本地存储的数据。

有些数据,像用户账号,通常在服务器端和APP端都会保存。如果在APP端修改这样的数据,最好是先向服务器发送修改请求,等接收到服务器成功修改数据的消息后,再修改本地存储的数据;如果服务器修改数据失败,就不修改本地存储的数据,这样可以避免APP端修改了,服务器端没有修改的情况发生,保持两者的数据同步。