编写极简抖音的难点|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的的第14天
前言
在暑假期间,我参与了青训营Android客户端的结营大项目。需求是做一个极简抖音,其功能包括以下几点:
项目需要实现抖音的 个人中心 以及 榜单页面 。
个人中心 为APP的主页面,实现了以下内容。
- 个人信息的展示
- 端侧对数据信息的统计
- 点击跳转到详情页查看粉丝和关注者列表
- 个人作品的浏览,浏览时个人背景渐变折叠
- 点击作品缩略图,页面打开自动播放
- 播放页面实现视频流
- 允许从播放页面打开抖音
- 登录、登出
- 登录状态过期自判断,自动跳转提醒重新登录
榜单页面 为APP的功能页面
单页面切换查看三种类型的榜单
点击榜单时间,浏览往期榜单序号以及可以选择序号查看往期内容
点击榜单的子项,可以下弹页面,提供查看子项的详细信息
上面描述的功能是项目中做出了要求,且我们已实现的功能。下面来讲以下我所遇到的难点
授权-第一个拦路虎
极简抖音依赖于抖音登录,那么就需要使用到抖音的第三方sdk。由于在之前的项目中未使用过这类第三方sdk来进行登录,对其特性规则并不熟悉,阅读文档的时候,有些重要的点也没抓到,导致第一个授权问题就栽跟头了。
白名单
文档需要开启一个白名单,才能完成第一次的授权绑定。但是白名单
trial.whitelist
只在第一次出现了,后面的申请文档没有再讲述过,所以我在未加该字段的情况下就去申请,导致一直返回我不在白名单的错误POST 的 body 类型
在看到开发文档中给出的 body 类型时候,按照类型和参数填入 Apifox 中进行测试,可以接收到正确的字段。但是当我使用代码写入的时候,我直接新建一个数据类,使用
Retrofit
中的@Body
传入,结果发现一直传回的是数据错误。知道仔细翻阅资料,我才发现我的理解不到位,直接使用@Body
注解,传入的类会变为 json 格式,很显然这不符合我们的要求。后来改用@Field
才成功,因为该字段传入的 body 才是对应类似于 key-value 类型的
Client_Token 的自动更新
client_token 的自动更新方案让我想很久,我需要其更新次数尽量少,在APP开启时候才会去执行更新,尽量在需要用到token之前就更新好。
所以我的解决方案就是在主页面启动的时候才进行一次更新,及页面启动一次就会获得一次最新的 token (其有效时间为2h),之后再启动WorkManager进行2h的自动更新,在主页面销毁的时候,注销这个后台任务。这样子就可以大概率的确保其会自动更新(当然,你得是将改APP挂了2h,未将其销毁)。但是由于其的不稳定性,我还是在获取token前做了判断,若是已经过期,就重新获取一次。
加载Dialog的造成的崩溃
在我对网络加载开启Dialog的加载动画的时候,我发现他不能有两次网络加载。无论网络加载是否做好了同步。经过排查发现,我是错误的使用了单例,由于我错误认为 Dialog 调用了 cancel() 方法之后,其实例依然存在,所以对 Dialog 的创建使用了单例模式。最后造成了,当 Dialog已经取消的时候,仍旧去调用已经不存在的 Dialog 造成了空指针的错误。调用Dialog 的时候不该使用单例模式。
下一篇,我将介绍项目中的优化