@JeromeLiee
2019-12-17T15:49:49.000000Z
字数 3209
阅读 463
直播中心
V6.3
直播中心由于存在赛程表,需要做到动态实时刷新,保证赛程表展示最新的比赛状态。
在该版本采取了固定刷新+倒计时刷新,保证了实时展示最新的比赛状态,但由于同一时间多个设备请求赛程表接口会造成后台压力,故采取了随机延迟的请求策略,防止高并发造成服务器压力过大。
刷新时间主要有两种,一种是固定刷新,另一种根据算法得出最短刷新时间,然后根据此时间进行倒计时。
默认固定为5min,但在开发测试阶段,可通过如下方式进行自定义设置固定刷新时间,方便调试。
自定义设置固定刷新间隔(开发与测试使用):
在设备的
/sdcard/pptv_atv/
路径下创建livecenter.properties
文件,其文件内容格式为:
refreshTime=30
上面的内容表示直播中心的固定刷新时间为30秒,可以任意设置其值,必须大于0才生效。
主要是获取最近赛事一个最短的时间,该时间可以是要结束的倒计时,或者是要开始的倒计时,字段解释如下:
startTime
:节目开始时间endTime
:节目结束时间matchStartTime
:比赛开始时间,只存在于对抗赛currentTime
:当前时间refreshTime
:倒计时的刷新时间min
:取二者较小值默认的 refreshTime
为12小时,计算 refreshTime
具体逻辑如下:
其中逻辑3会一直循环遍历,直到遇到逻辑2。
当用户通过按遥控器进入直播中心页面tab,包括从直播中心页面进入其它页面再返回,则会立刻请求赛程表接口,并且重新设置1.1小节中的刷新时间。
上文说过,由于同一时间多个设备请求赛程表接口会造成后台服务器压力,故采取了随机延迟的请求策略。在固定刷新或倒计时刷新结束执行时,会随机10~120秒去执行赛程表网络请求,所以会存在一定的时间误差,这是暂时无法避免的。
由于直播中心在首页展示,当出现网络异常情况,需要展示缓存数据,故需要采取一定的数据缓存策略。缓存的数据包括赛程表和按左键弹出的赛事筛选列表,主要分为内存缓存和本地磁盘缓存。
当执行网络请求时,获取数据成功后会将数据缓存至内存中,并且每次请求成功后会更新该缓存。当接口返回数据异常或网络异常时,则判断内存缓存中是否有数据,有则返回,否则进一步判断本地磁盘缓存。
当执行网络请求时,获取数据成功后先缓存至内存中,同时会缓存至本地磁盘缓存中,同样每次请求成功会更新本次磁盘缓存。当接口返回数据异常或网络异常,首先会判断内存缓存,当内存缓存没有数据,则判断本地磁盘缓存是否存在数据,是则返回,否则返回空的数据集合,页面UI展示数据异常弹窗提示。
当获取到数据后,就需要刷新展示该数据。在展示数据时需要进行一系列的操作,例如校正数据,对数据格式进行转换等处理,以及刷新一条还是全部都刷新等逻辑判断。
通过调用实时刷新接口,获取昨天和今天所有对抗赛最新的比分和比赛状态,处理完之后将数据展示到前端UI页面。
从其它tab切换到直播中心后,会默认展示最佳展示位置的赛事节目,其最佳展示位置的规则为:
主要分为强制全量刷新和部分刷新两种。
当重新获取赛程表信息,如果满足强制刷新逻辑的触发时机,则执行强制刷新,并计算最佳展示位置,焦点被重新落焦在最佳展示位置的比赛上,同时还会请求详情页接口。强制刷新的触发时机如下:
当不满足强制全量刷新的触发时机,则会进行部分刷新逻辑,只会刷新其比分、状态等,落焦item位置不变。
播放行为主要分为三种,一是进入页面默认播放,二是用户点击某赛事或点播以及循环播放,三是节目状态发生变化开始播放或结束播放。
进入直播中心后默认播放最佳展示位置的赛事节目,如果该节目已开始,则播放该赛事;如果已结束或未开始,则判断有没有点播节目,有则播放,无则显示背景图。
当前展示的赛事节目状态发生改变时,则会根据其状态变化进行播放行为的改变:
当前浏览的比赛已经开始
用户进行点击播放操作时,由于数据异常,会导致无法播放,会弹出toast错误提示,提示内容为 暂时不能播放哦(错误码)
,具体错误码含义如下:
新旧直播中心目前共存,默认显示新版直播中心,切换配置在赛程表文案配置接口里,将字段 livecenter_ui
的值设为 old
,然后重启应用,则会展示旧的直播中心,配置其它值则展示新的。