字节训练营-玩转客户端大作业:新闻类安卓APP
作者:麦济仁,王珏
成员 | 负责部分 |
---|---|
麦济仁 | 欢迎界面、主界面及其架构和组件(附加功能和基础部分) |
王珏 | 登陆界面、文章界面及其架构和组件(进阶一、二、三) |
架构图中每个红框表示一个模块,主界面模块内部有三个事件槽:屏幕事件、拉取触发和组件追加。其中屏幕事件响应诸如滑动、点击之类的事件,主界面有个内部触发,比如说手指滑动,内容滚动到靠近屏幕底部的时候,会触发一个内容拉取事件。内容拉取会将一个预设的数据批次大小值传给数据批发器,数据批发器在准备好足够数据之后,触发一个回调,将批量数据追加到主界面的内容页中。
这里的数据批发器是我们设计的一个相对巧妙的模块,它内部包含两个对象,或者说两个依赖,数据迭代器和数据包装器。我们通过依赖注入来定义数据批发器的具体行为。比如说,数据批发器需要迭代器迭代来获取数据,在这个项目中,我们注入一个本地数据源,其实就是读取本地的json文件获得json数组,数组本身是可迭代的,注入到批发器里面,它就会不断获取json文件中定义的公告信息;而数据包装器的职责,是对迭代数据进行一个后处理,因为我们通常迭代到的都是比较粗的、原始的数据,比如说json中读到的都是些文本信息对吧,这样我们就需要进行一些特定的包装,使得从这里批发出去的数据是处理好的、能够直接使用的,等于说这里是一种委托,委托处理。在这个项目中,我们读取json中定义的公告类型,向这个工厂中申请构建一个实例,这个工厂在公告项工厂中详细介绍,生成的实例是一种具体的Layout,然后包装器再进行一些布局设置、属性设置。在准备好之后,将数据批发出去,调用回调将数据追加到主界面内容页中去。通过设计这样的模块呢,我们可以将UI和数据加载行为做一个分离,而依赖注入的设计模式,使得这个行为可以很轻松地被定义,举例说,如果后续需要从网络拉取公告项的话,我们可以将这个本地数据源换成一个网络数据源,其实只需要封装一下迭代方式就可以了;而公告项工厂使用反射实现,也可以很方便地增加新的公告类型。此外,这个架构图只介绍了每个模块对外暴露的接口,而内部实现是未定义的,实际上数据批发器我们设置了一个缓冲队列,在构造之初开启副线程并行地准备数据,可以大幅提升运行效率。这也是低耦合带来的好处,只去优化实现,而不是接口。
再说回屏幕事件,除了内容拉取,还有点击公告的时候会跳转到文章详情页,这里约定了一组简单的接口,点击事件以及附加的信息会通过这个接口发送出去,到左边两个界面中具体处理。除此之外,我这里还有一个用户信息模块,这个模块对外的读写特性对于所有模块都是平等的,登陆界面会将一些登录后获取的信息写到用户信息模块,主界面也会从用户信息模块读取一些用户信息,用来显示头像之类的。后续如果有扩展需要的话,还有一些个人主页也会在这个框架下实现。
公告项工厂,通过给工厂一个类型id,工厂去寻找已经实现的具体类,并创新类的实例返回。所有类型的公告,都继承自Announce抽象类,这个类是LinearLayout的子类,要求实现SetValues方法,来设置自身的属性,比较基础的有标题、作者、时间这些属性,而子类继承之后可以再拓展其他属性,并重写设置属性的行为。比如类型1、2的单缩略图,类型4的多缩略图等等。具体类会再去自己定义详细的布局方式。
总展示 与 文章阅读展示
-
基础功能: 公告列表页(需要支持5种不同类型的公告)
- 功能描述:
- 类似今日头条客户端信息页,支持多种类型的公告文章。
- 列表页需要支持 纯文本标题、标题+小图(左)、标题+小图(右)、标题+大图、标题+多图 等5种类型。 标题包含主标题(元数据中的title)以及副标题(元数据中作者+发布时间)。具体样式可以自由发挥。资料中有对应样式的参考。
- 公告元数据从资源包中metadata.json文件获得。所需图片,可以在资源包中找到。具体使用说明参考资料部分。
- 实现要点:
- 基本UI 界面 基础控件 (列表页实现)
- 读取并展示本地图片,并按照规定尺寸展示
- 功能描述:
-
进阶功能一: 登录功能
- 功能描述:
- 用户点击列表页公告,需要提供登录功能。
- 增加登录页面,支持输入用户名和密码,以及一个登录按钮。用户名/密码 可以自由输入,具体样式可以自由发挥。
- 用户点击登录后,通过网络请求获得token。用户需要登录成功后才能看到公告详情。
- 需要缓存登录获得的token,已经登录过再次点击列表公告页面时,无需再次登录。
- 本阶段可以不实现公告详情页面,仅展示登录接口返回的数据,或者缓存的token即算完成。具体样式可以自由发挥。
- 实现要点:
- UI界面实现(登录页面实现)
- http网络请求操作
- 多线程操作
- 数据缓存
- 功能描述:
-
进阶功能二: 展示纯文本公告内容
- 功能描述:
- 用户点击列表页公告时,使用登录接口获得的token,根据文章id通过网络请求 请求文章正文(纯文本)。
- 展示文章内容,包括文章标题、文章作者、文章发布时间以及文章正文。 具体样式参考今日头条文章,可以自由发挥。
- 实现要点:
- UI界面实现(文章详情页面实现)
- 网络请求进阶,基础认证
- 多线程操作
- 跨界面数据传输
- 功能描述:
-
进阶功能三: 展示图文混排公告内容
- 功能描述:
- 使用登录接口获得的token,根据文章id通过网络请求 请求文章正文(Markdown格式,仅标注标题以及图片在文本中位置)。
- 展示文章内容,包括文章标题、文章作者、文章发布时间以及文章正文。 要求:标题加粗并比正文大一个字号。图片显示在正确的位置。 其他样式可以自由发挥。
- 实现要点:
- 富文本渲染、图文混排
- UI示意图
- 同进阶功能二
- 资源包同进阶功能二
- 功能描述: