目录介绍

  • 1.关于项目架构的技术堆栈
  • 1.1 该项目App整体架构
  • 1.1.1 目前项目[准备中]使用的架构
  • 1.1.2 市面常见的架构
  • 1.1.3 MVP架构使用心得
  • 1.2 主要的技术要点
  • 1.2.1 视频播放技术
  • 1.2.2 音频播放技术
  • 1.2.3 复杂页面展示
  • 1.2.4 状态切换
  • 1.2.5 缓存
  • 1.2.6 音视频文件下载技术
  • 1.3 主要的开源框架介绍
  • 1.3.1 网络请求框架
  • 1.3.2 注解框架
  • 1.3.3 图片加载框架
  • 1.3.4 6.0之后权限申请框架
  • 1.3.5 事件总线框架
  • 1.3.6 内存泄漏测试框架
  • 1.3.7 bug管理
  • 1.4 常用的第三方库或插件说明与选择
  • 1.4.1 上拉加载更多与下拉刷新
  • 1.4.2 轮播图
  • 1.4.3 关于页面刷新状态的管理
  • 1.4.4 常见的弹窗,吐司
  • 1.4.5 常用工具类库
  • 1.4.6 阿里编码规则插件
  • 1.4.7 测试部分
  • 2.项目中的代码规范
  • 2.1 关于包名,类名,方法名,变量等命名规则
  • 2.1.1 包名与分包规则
  • 2.1.2 类名命名,类名规范,以及类名注释统一
  • 2.1.3 方法名命名,规范以及注释
  • 2.1.4 变量,常量命名规范及注意要点
  • 2.2 日志打印
  • 2.2.1 日志统一打印,测试打开,上线关闭
  • 2.3 UI相关说明,资源文件string,color
  • 2.4 代码布局规范
  • 3.项目中的常见业务分析
  • 3.1 版本更新分析
  • 4.关于代码解耦和抽离思索
  • 4.1 业务代码避免耦合度过高
  • 4.2 如何解耦
  • 4.3 接口的分离
  • 5.其他问题说明
  • 5.1 版本更新情况
  • 5.2 参考链接
  • 5.2 个人博客

1.关于项目架构的技术堆栈

1.1 该项目App整体架构

  • 1.1.1 目前项目[准备中]使用的架构
  • 准备使用架构是MVP,Rx+Retrofit是网络请求框架,Vlayout是阿里出的处理复杂UI界面框架,ijkplayer是bilibili公司出的音视频播放框架
  • MVP作为MVC的演化,解决了MVC不少的缺点,对于Android来说,MVP的model层相对于MVC是一样的,而activity和fragment不再是controller层,而是纯粹的view层,所有关于用户事件的转发全部交由presenter层处理。
  • 1.1.2 市面常见的架构
  • 目前存在常见架构有MVC,MVP,MVVM等,具体可以看我的印象笔记之架构分析文档
  • 1.1.3 演变后的心得
  • MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。在MVP模式里通常包含3个要素(加上View interface是4个):
  • View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)
  • Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
  • Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
  • View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试
  • 感觉最大的差别差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view层发出的事件传递到presenter层中,presenter层去操作model层,并且将数据返回给view层,整个过程中view层和model层完全没有联系,虽然view层和model层解耦了,但是view层和presenter层不是耦合在一起了吗?其实不是的,对于view层和presenter层的通信,我们是可以通过接口实现的,具体的意思就是说我们的activity,fragment可以去实现实现定义好的接口,而在对应的presenter中通过接口调用方法。解决了MVC模式中一个activity代码量太大问题,维护难的问题。

1.2 主要的技术要点

  • 1.2.1 视频播放技术
  • 具体可以参考我的视频播放器案例,记录视频播放中各个要点和代码逻辑思路,以及记录bug出现与解决办法,持续更新中。链接地址:http://www.jcodecraeer.com/plus/view.php?aid=9147
  • 1.2.2 音频播放技术
  • 具体可以参考我的音频播放器项目与笔记,记录音频的各种知识要点。关于音视频,涉及到编码解码的问题,比较复杂,比较复杂,链接地址:
  • 1.2.3 复杂页面展示
  • 对于复杂页面,由于需求会变化,所以初期选择一定要支持拓展性强,功能强大。避免业务变化导致重新写代码,或者页面展示了,但是会出现页面卡顿,滑动冲突,或者代码内部混乱不便于维护。所以可以选择阿里Vlayout框架。关于如何使用以及案例展示,可以参考我的博客:
  • 对应的如何使用的项目有:https://github.com/yangchong211/YCVideoPlayer
  • 对于一般list页面,一般不会太复杂。但是可能会有多种状态,比如刷新中,展示页面成功,加载数据失败,加载数据为空多种状态,且支持上拉加载下拉刷新。ok,则刚好可以使用之前封装库,YCRefreshView。项目使用和案例地址:https://github.com/yangchong211/YCRefreshView
  • 1.2.4 状态切换
  • 对于Android加载页面来说,有些项目将加载状态写在Base类中,如果是不继承那么会出现问题。如果写在布局中,然后根据数据访问情况展示或者隐藏不同状态的布局,也会比较复杂,比较凌乱。
  • 后来,参考大神思路,让View状态的切换和Activity,fragment彻底分离开,必须把这些状态View都封装到一个管理类中,然后暴露出几个方法来实现View之间的切换。 在不同的项目中可以需要的View也不一样,所以考虑把管理类设计成builder模式来自由的添加需要的状态View。关于项目的使用可以参考我的封装库案例。地址是:https://github.com/yangchong211/YCStateLayout
  • 1.2.5 缓存
  • 1.2.6 音视频文件下载技术

1.3 主要的开源框架介绍

  • 1.3.1 网络请求框架
  • Retrofit 是 Square 公司出品的默认基于 OkHttp 封装的一套 RESTful 网络请求框架。
  • Retrofit 的封装可以说是很强大,使用 Retrofit + OkHttp + RxJava + Dagger2可以说是目前比较潮的一套框架。
  • 1.3.2 注解框架
  • butterknife,专注于Android系统的View注入框架
  • 1.3.3 图片加载框架
  • 谷歌原生glide,功能强大,使用方法以及源码分析可以参考郭霖大神博客:
  • squareup公司出品的picasso也不错
  • 图片加载在项目中许多地方都会用到,建议将所有的加载图片的方法整理成工具类,然后通过类静态调用方法,可以统一管理。那么使用的使用,就可以一行代码搞定,简洁代码。便于阅读与定位!
  • 1.3.4 6.0之后权限申请框架
  • 对于权限管理,可以直接使用谷歌原生权限框架,具体使用可以参考业余项目:https://github.com/yangchong211/YCAudioPlayer
  • 1.3.5 事件总线框架
  • 关于activity,fragment,service等不同组件直接通信,可以使用事件总线框架。关于事件总线EventBus使用以及源码分析,可以参考我的博客:https://www.jianshu.com/p/4cec5d7233e8
  • 1.3.6 内存泄漏测试框架
  • 使用squareup公司出品的leakcanary框架,项目测试阶段不仅要修改崩溃bug,也要避免内存泄漏问题。关于常见的内存泄漏场景与解决办法,可以参考我的博客Leakcanary检测内存泄漏汇总:https://www.jianshu.com/p/c345f63ec8e5
  • 1.3.7 bug管理
  • 可以使用腾讯出品的bugly,集成第三方bug管理平台,可以有效收集广大用户APP使用崩溃情况。

1.4 常用的第三方库说明与选择

  • 注意:关于第三方库选择,只选择合适的,不选择代码量最多的库。比如有些库,代码很多,功能很强大,但是你只是用到一个很小的功能。倒不如选择轻量级的库。
  • 1.4.1 上拉加载更多与下拉刷新
  • 可以选择王浩大神BGA刷新,便于拓展
  • 也可以使用封装库YCRefreshView,支持该功能,也支持多种状态切换
  • 1.4.2 轮播图
  • 可以用banner开源库,轮播图这块star最多,功能也很强大。代码量大,支持样式很多……
  • 如果轮播图使用范围很小,且要求样式单一,可以使用自己封装库YCBanner。
  • 1.4.3 关于页面刷新状态的管理
  • 可以使用封装库YCStateLayout
  • 1.4.4 常见的弹窗,吐司
  • 待更新
  • 1.4.5 常用工具类库
  • 可以使用Blankj[布兰柯基]的开源工具库,GitHub颇受好评,一键集成与使用
  • 1.4.6 其他库
  • 待更新

2.项目中的代码规范【重要】

2.1 关于包名,类名,方法名,变量等命名规则

  • 2.1.1 包名与分包规则
  • 包名:com.zero2ipo.sqdx
  • 分包的结构如下所示
  • 关于分包的规范以及注意事项,可以参考我整理的Android编码规范一文:http://www.jcodecraeer.com/plus/view.php?aid=9337
  • 2.1.2 类名命名,类名规范,以及类名注释
  • 2.1.3 方法名命名,规范以及注释
  • 2.1.4 变量,常量命名规范及注意要点

2.1.2 编码规范文档

2.2 日志打印

  • 2.2.1 日志统一打印,测试打开,上线关闭

2.3 UI相关说明,资源文件string,color

  • 2.3.1 对于UI中的字体颜色。可以参看新芽昊哥的做法,统一备注资源color属性。比如:
  • 看到网上好多案例,发现对于这个color资源文件,定义不规范而且有点杂乱,引用的使用会有点苦恼。
  • 2.3.2 关于这块,个人感觉非常不错,可以参考网易云音乐Android 3.0视觉设计规范文档:http://www.25xt.com/appdesign/12385.html

3.项目中的常见业务分析

3.1 版本更新分析

4.关于代码解耦和抽离思索

4.1 业务代码避免耦合度过高

  • 待更新

4.2 如何解耦

4.3 接口的分离

5.其他问题说明

5.1 版本更新情况

  • v1.0.0 2018年1月17日
  • v1.0.1 2018年2月8日

5.2 参考链接

  • 安居客Android项目架构演进
  • 为什么要重视程序的架构设计
  • 基于MVP创建适合自己的架构:https://www.jianshu.com/p/2ca7767df08c
  • 刘望舒大神,Android架构(一)MVP全解析